C 以下是什么意思?

C 以下是什么意思?,c,arrays,C,Arrays,我知道sampleArray现在指向数组的第一个元素 然而,当我说&sampleArray时,它意味着什么?这是否意味着我正在获取sampleArray变量的地址?或者它是指二维数组变量 那么,我可以这样做吗: int sampleArray[] = {1,2,3,4,5}; 数组的名称计算为其地址(即其第一个元素的地址),因此sampleArray和&sampleArray具有相同的值 但是,它们的类型不同: sampleArray的类型为int*(即指向int的指针) &sampleAr

我知道
sampleArray
现在指向数组的第一个元素

然而,当我说
&sampleArray
时,它意味着什么?这是否意味着我正在获取
sampleArray
变量的地址?或者它是指二维数组变量

那么,我可以这样做吗:

int sampleArray[] = {1,2,3,4,5};

数组的名称计算为其地址(即其第一个元素的地址),因此
sampleArray
&sampleArray
具有相同的值

但是,它们的类型不同:

  • sampleArray
    的类型为
    int*
    (即指向int的指针)
  • &sampleArray
    的类型为
    int(*)[5]
    (即指向五个int的数组的指针)
int(*p)[5]
声明指向五个
int
s数组的指针
p
。因此

int (*p)[5] = &sampleArray?

否,
sampleArray
实际上并不指向数组的第一个元素
sampleArray
是数组

产生混淆的原因是,在大多数使用
sampleArray
的地方,它将被指向数组第一个元素的指针所取代。“大多数位置”表示“它不是
sizeof
或一元运算符的操作数的任何位置”

由于
sampleArray
是数组本身,并且作为一元操作数-
&
是保持其个性的地方之一,这意味着
&sampleArray
是指向整个数组的指针。

一些示例代码:

int (*p)[5] = &sampleArray; // well-formed :)
int (*p)[5] = sampleArray;  // not well-formed :(
编译程序

$gcc—gcc(gcc)3.4.4版 (cygming special,gdc 0.12,使用dmd 0.125)版权(C)2004免费软件基金会,这是免费的 软件;请参阅复制的源代码 条件没有担保;不 即使是为了适销性或适合性 为了特定的目的


与往常一样,comp.lang.c常见问题解答已经解释了这一点:


您可能应该阅读。

这被称为数组的内部化。数组是类似类型数据的集合,如int、char、float number等。

“我知道sampleArray现在指向数组的第一个元素。”这是错误的
sampleArray
是一个数组,不是指针;它们不是一回事。不,sampleArray和&sampleArray有不同的值&sampleArray是sampleArray的地址。@WhirlWind实际上,如果您尝试它(不确定是否保证),它们具有相同的值。但是它们的类型不同。@whirwind-No…sampleArray和&sampleArray具有相同的值。编写一个简单的程序,自己尝试一下。次要nit:表达式
sampleArray
的类型是
int[5]
,在大多数上下文中,它会隐式(衰减)转换为
int*
#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