在这里,我对输出有疑问。
为什么输出相同?
int (*r)[10];
printf("r=%p *r=%p\n",r,*r);
return 0;
Platform- GCC UBUNTU 10.04
答案 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 == a
和r
。
表达式int
的类型为“指向a
的10个元素数组的指针”,其值为*r
的地址。表达式int
具有类型“{ - 1}}的10元素数组,它被转换为”指向int
的指针“,其值被设置为第一个元素的地址,这种情况是a[0]
。同样,两个表达式的值是相同的。