当我们声明双指针时 int/char 到底是什么 (**q)

What exactly int/char when we declare double pointer(**q)

让我们使用 64 位机器

其中指针在 64 位机器中为 8 个字节

int *p ; // it is a pointer to integer variable so when i increment p
         // i.e., p++ it will increment by 4 

char *r; // It is pointer to character . 
         // So if i increment 'r' it will increment by 1

int **q ; // if i increment q  ie.,q++ it will increment 8 bytes 

我尝试了这段代码,如果有什么不对的地方请指正

int a=10; 
int *p; 
char *r; 
int **q; 
p=&a; 
q=&p; 
printf("p= %p\t r= %p\t q=%p\n",p,r,q);
 printf("p(increment)= %p\t r (increment)= %p\tq (increment)= %p ",++p,++r,++q); 

输出

 p= 0x7fff669bb1bc r= 0x7fff669bb2a0 q=0x7fff669bb1a0
 p(increment)= 0x7fff669bb1c0 r (increment)= 0x7fff669bb2a1 q (increment)= 0x7fff669bb1a8

int/char/float在双指针中的作用是什么?

int **p 中,您将指针增加它指向的大小(即指针)。由于指针的大小为8,它将增加8

最终类型在这里没有作用。它的行为与指向 void.

的指针一样

引用后缀 ++ 运算符的 属性,来自 C11,章节 §6.5.2.4,后缀递增和递减运算符, (强调我的)

The result of the postfix ++ operator is the value of the operand. As a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it). [...]

  • int *p ;的情况下,p是指向类型int的指针,因此增量将基于sizeof(int)

  • int **p ;的情况下,p是指向类型int *的指针,因此增量将基于sizeof(int *)

好吧,这不仅取决于您的机器,还取决于您的实现。您可以通过输出 sizeof psizeof rsizeof q 来计算它们。打印 sizeof (int *)sizeof (char *)sizeof (int **) 也有效。

C programmers traditionally like to know a lot (perhaps more than they need to) about the underlying machine implementation.

在我看来,你不需要知道这些东西,因为编译器会为我们处理得很好(根据 C 标准)。此外,大多数使用这些东西的实践本质上都是未定义的行为。