2014-09-01 71 views
2

下面是一段代码,我已经写了:指向数组的指针derefferencing

#include <stdio.h> 
void main() 
{ 
    int (*p)[2]; 
    int a[2] = {0, 1}; 
    p = &a; 
    printf("p = %x\n",p); 
    printf("&p = %x\n",&p); 
    printf("a = %x\n",a); 
    printf("&a = %x\n",&a); 
    printf("*p = %x\n",*p); 
    printf("*a = %x\n",*a); 
} 

下面是我得到的输出:

p = bfd387c8 
&p = bfd387c4 
a = bfd387c8 
&a = bfd387c8 
*p = bfd387c8 
*a = 0 

现在我有这样的怀疑,怎么可能p和* p是相等的。其实p = a;*a = 0; 那么为什么* p也不等于0。请这是我的第一个问题在堆栈 overflow.Please帮助我。

+0

你指'INT * P [2];'代替'INT(* P)[2];'? – Sathish 2014-09-01 09:39:17

+1

顺便说一句,你应该使用'%p'来打印一个指针的值。 – chrk 2014-09-01 09:43:17

+0

'** p == * a == 0'。 – Nelfeal 2014-09-01 09:53:29

回答

3

你的程序应该是这样的:

#include <stdio.h> 
int main() 
{ 
    int (*p)[2]; 
    int a[2] = {0, 1}; 
    p = &a; 
    printf("p = %p\n",(void*)p); 
    printf("&p = %p\n",(void*)&p); 
    printf("a = %p\n",(void*)a); 
    printf("&a = %p\n",(void*)&a); 
    printf("*p = %p\n",(void*)*p); 
    printf("*a = %x\n",*a); 
    printf("**p = %x\n",**p); 
    return 0; 
} 

您应该使用%p和转换为(void*)打印指针。

p指向数组a(这意味着a == &a)等p == *p。要获得数组的第一个值,您必须使用**p,因为它是一个指向数组的指针。

+0

好吧,但为什么我应该做一个(void *)来打印这个地址。好的,在此先感谢。 – Akhil 2014-09-01 11:03:24

+0

,因为'%p'需要一个指向void的指针。 – mch 2014-09-01 11:52:29

+0

,因为'(* p)[0]'是第一个值,而'p [0]'是指向数组的指针。 'p [0]'与'* p'和'p'具有相同的值,全部3指向数组或数组的第一个值。 – mch 2014-09-01 16:39:54

1

除了当它是sizeof或一元&运营商的操作数,或是一个字符串被用来初始化一个声明另一个数组,类型“的T N元件阵列”的表达将被转换(”衰减“)转换为类型为”指向T的指针“的表达式,并且该表达式的值将是该数组的第一个元素的地址。

在声明的阵列,它的布置在存储器像这样:

  +---+ 
    arr[0]: | | 
      +---+ 
    arr[1]: | | 
      +---+ 
      ... 
      +---+ 
arr[N-1]: | | 
      +---+ 

注意,没有单独的arr变量来存储阵列的第一个元素的地址;第一个元素的地址与整个数组的地址相同。

因此,值表达式的arr&arr是相同的,但类型是不同的(对比T *T (*)[N])。

由于p的计算结果为&a*p的计算结果为a,并且由于&aa产生相同的值,则p*p也将产生相同的值。

(*p)[0] == a[0] == *a == 0