指向整数数组的指针

时间:2011-12-20 12:14:56

标签: c pointers multidimensional-array

在这里,我对输出有疑问。

为什么输出相同?

   int (*r)[10];
   printf("r=%p  *r=%p\n",r,*r);
   return 0;

Platform- GCC UBUNTU 10.04

3 个答案:

答案 0 :(得分:7)

因为数组的名称衰减为指向其第一个元素的指针。

   int (*r)[10]; 

是指向10整数数组的指针 r为您提供指针。

必须取消引用指向数组的指针才能访问每个元素的值 因此,与您的想法相反**r而不是*r可以访问数组中的第一个元素。
*r为您提供整数数组中第一个元素的地址,与r

相同

重要的是要注意:
数组不是指针

但是当涉及数组名称的表达式没有意义时,涉及数组名称的表达式有时会表现为指针。

答案 1 :(得分:4)

如果你看下面的程序,你会更好地理解。

#include <stdio.h>

int main()
{
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int (*r)[10] = &a;

    printf("r=%p  *r=%p  *(r+0)=%p  *(r+1)=%p\n", r, *r, *(r+0), *(r+1));
    printf("sizeof(int)=%d \n", sizeof(int));

    return 0;
}

输出如下:

r=0xbfeaa4b4  *r=0xbfeaa4b4  *(r+0)=0xbfeaa4b4  *(r+1)=0xbfeaa4dc
sizeof(int)=4 

观察/指出要点:

  • _DO_NOT _ 取消引用尚未指向地址的指针。因此,在您的程序中int (*r)[10];被取消引用而未被分配到内存区域。这是不可接受的。

  • 如果你看到输出 - * r与*(r + 0)相同,它与r相同(在这种情况下仅为w.r.t)

  • 如果你看到*(r + 0)和*(r + 1)的输出它是40字节(0xbfeaa4dc - 0xbfeaa4b4 = sizeof(int)*数组的大小(在这种情况下是10)因此,当您将指针递增到特定类型时,它会增加到sizeof(type)bytes!

  • 解释了关于指向整数数组的其他值得注意的要点here

希望这有帮助!

答案 2 :(得分:4)

请记住,当大多数上下文中出现“N元素数组T”类型的表达式时,它将转换为“指向T的指针”类型的表达式,其值将为数组中第一个元素的地址。此规则的例外情况是,当数组表达式是sizeof或一元&(地址)操作数的操作数时,或者如果数组表达式是用作初始化程序的字符串文字数组声明。

您的情况是以下镜像:

int a[10] = {0};
printf("a = %p, &a = %p\n", (void *) a, (void *) &a);

printf调用中,表达式a的类型根据规则从“{元素int的10个元素数组”转换为“指向int的指针”上面,它的值将是第一个元素(&a[0])的地址。表达式&a具有类型“指向int的10元素数组的指针”,其值将与a相同(数组中第一个元素的地址相同)作为数组本身的地址)。

您的代码有一些未定义的行为,因为您在将r分配到指向任何有意义的位置之前解除引用int a[10] = {0}; int (*r)[10] = &a; printf("r = %p, *r = %p\n", (void *) r, (void *) *r); ,因此您不能相信输出完全准确。我们可以解决这个问题:

r == &a

在这种情况下,*r == ar

表达式int的类型为“指向a的10个元素数组的指针”,其值为*r的地址。表达式int具有类型“{ - 1}}的10元素数组,它被转换为”指向int的指针“,其值被设置为第一个元素的地址,这种情况是a[0]。同样,两个表达式的是相同的。