当我们声明双指针时,究竟是什么int / char(** q)

时间:2016-02-01 07:06:41

标签: c pointers types pointer-to-pointer

让我们拿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在双指针中的作用是什么?

3 个答案:

答案 0 :(得分:5)

引用postfix ++运算符的属性,来自C11,章节§6.5.2.4, Postfix递增和递减运算符,(强调我的< / em>的)

  

后缀++运算符的结果是操作数的值。作为副作用,   操作数对象的值递增(即适当类型的值1   添加到它)。 [...]

  • 如果是int *p ;,则p是指向int类型的指针,因此增量将基于sizeof(int)

  • 如果是int **p ;,则p是指向int *类型的指针,因此增量将基于sizeof(int *)

答案 1 :(得分:0)

嗯,这不仅取决于您的机器,还取决于您的实施。您可以输出sizeof psizeof rsizeof q来计算出来。打印sizeof (int *)sizeof (char *)sizeof (int **)也可以。

  传统上,C程序员喜欢知道很多(也许比他们更多   需要)关于底层机器实现。

从我的角度来看,你不需要知道这些东西,因为编译器会为我们(根据C标准)很好地处理这个问题。此外,大多数使用这些东西的做法本质上都是未定义的行为。

答案 2 :(得分:-2)

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

最终类型在这里没有任何作用。它的行为与指向void的指针的行为相同。