int sampleArray[] = {1,2,3,4,5};
我知道sampleArray
现在指向数组的第一个元素。
但是,当我说&sampleArray
时,它意味着什么?这是否意味着我得到了sampleArray
变量的地址?或者它是否意味着二维数组变量?
那么,我可以这样做:
int (*p)[5] = &sampleArray?
答案 0 :(得分:9)
不,sampleArray
并没有真正指向数组的第一个元素。 sampleArray
是数组。
出现混淆是因为在大多数使用sampleArray
的地方,它将被替换为指向数组第一个元素的指针。 “大多数地方”的意思是“它不是sizeof
或一元 - &
运营商的操作数”。
由于sampleArray
是数组本身,并且作为一元的操作数 - &
是保持该个性的地方之一,这意味着&sampleArray
是指向整个阵列。
答案 1 :(得分:7)
数组的名称求值为其地址(第一个元素的地址),因此sampleArray
和&sampleArray
具有相同的值。
但它们的类型不同:
sampleArray
的类型为int*
(即指向int的指针)&sampleArray
的类型为int (*)[5]
(即指向五个整数数组的指针)。 int (*p)[5]
向五个p
的数组声明指针int
。 Ergo,
int (*p)[5] = &sampleArray; // well-formed :)
int (*p)[5] = sampleArray; // not well-formed :(
答案 2 :(得分:1)
像往常一样,comp.lang.c FAQ已经解释了这个问题:
答案 3 :(得分:0)
一些示例代码:
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5};
int (*p)[5] = &a;
//Note
//int (*p)[5] = a; // builds (with warnings) and in this case appears to give the same result
printf( "a = 0x%x\n" , (int *)a);
printf( "&a = 0x%x\n", (int *)(&a));
printf( "p = 0x%x", (int *)p);
return;
}
输出 - 两种方式相同。
$ ./a.exe
a = 0x22cd10
&a = 0x22cd10
p = 0x22cd10
编译器
$ gcc --version gcc(GCC)3.4.4 (cygming special,gdc 0.12,使用dmd 0.125)版权所有(C)2004 Free Software Foundation,Inc。这是免费的 软件;看到复制的来源 条件。没有保修;不 即使是适销性或健身 特别针对目的。
答案 4 :(得分:0)
这称为阵列的绝缘。 array是类似于int,char,float number之类的类似数据的集合。