在C语言中,数组名是指针吗?

6

我知道在C语言中,指针是一个保存地址的变量。 例如:

int myVar;
int *p;
p = &myVar;
printf("%p\n", p);
printf("%p\n", &p);

输出将是两个不同的地址,第一个是myVar的地址,第二个是指针本身的地址,这意味着指针也是一个变量,并且在内存中有一个地址(如果我错了,请纠正我)。

但我的问题与数组有关,例如我们有这段代码:

int myArray[10];

在这里,我认为myArray也是一个指针,它保存了myArray的起始点即myArray[0]的地址。所以当我打印myArray[0]和myArray的地址时,得到的结果是相同的:

printf("%p\n", &myArray[0]);
printf("%p\n", myArray);

现在让我困惑的是当我尝试打印myArray本身的地址时:

printf("%p\n", &myArray);

在这里,我得到了与指针类似的结果。myArray是一个标签还是其他什么东西?


你为什么期望得到另一个地址? - mangusta
请看以下网址:https://www.studytonight.com/c/pointers-with-array.php。 - Victor Gubin
1个回答

7
&myArray[0] 是数组第一个元素的地址,&myArray 是数组的地址。这两者必须具有相同的地址,但是它们是不同类型的。 myArray 不是指针。它是一个数组,在某些情况下会 衰变 为类型为 int* 的指针。作为 printf 的参数就是这样一种情况。

好的回答!OP:如果你想更加困惑,可以尝试添加以下内容:printf("%p\n", *(&myArray));printf("%p\n", *(&myArray[0]));为了达到最大效果,请初始化你的数组:int myArray[10] = { 1,2,3,4,5,6,7,8,9,10 }; - Adrian Mole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接