首页 > 解决方案 > 如果 array_name 是一个指针 int *ptr = array_name 不是指向指针的指针

问题描述

我是 C 的初学者,最近发现数组名称是指向数组第一个元素的地址的指针,这是一个非常容易理解的概念,因为指针是一个保存内存地址的变量。

int x[4];
printf("%p",x); // x is  a pointer

我无法理解的是以下代码:

int x[4], *ptr;
ptr = x;

这很简单,但是第二行ptr = x 指向指针x,这不会使ptr指针指向我需要声明ptr为的指针int **ptr吗?如果我的理解没有记错的话,x存储x[0]这样做的地址ptr = x,是ptr指向另一个指针,这x使得它本质上是指向一个指针的指针。

标签: cpointers

解决方案


数组不是指针。

但首先,让我们看一下作业。假设你有:

int SomeInt;
int *a = &SomeInt;

此时a指向SomeInt。然后我们这样做:

int *b;
b = a;

这是做什么的?它设置b等于a。它没有b说明a。赋值后,b具有与 相同的值a,所以b指向同一个地方a指向;它指向SomeInt. 它不指向a

同样,您ptr = x;没有ptr指出x. 它ptr等于表达式的值x

但是,在这种情况下,该值不是数组,因为发生了自动转换。我们将在下面讨论。

回到不是指针的数组,之后int x[4];x是四个数组的名称int。如果使用 打印数组的大小,则在 4 字节printf("%zu\n", sizeof x);的系统上将得到 16 int,因为数组的大小为 16 字节。这是因为x数组是数组,数组sizeof x的大小也是。

但是,当您编写 时ptr = x;,它不会将数组分配给ptr。它将指向第一个元素的指针分配给ptr. 这是如何运作的?

因为早期的 C 语言不支持处理整个数组,例如将一个数组分配给另一个数组,所以您只能通过指针来处理它们。因此,要将指针设置为指向数组的第一个元素,您必须编写ptr = &x[0];. 为了使这更容易,该语言旨在允许您改为编写ptr = x;。当您以这种方式使用数组时,它会自动转换为指向其第一个元素的指针,就像您写&array[0]的不是array.

每当在表达式中使用数组时,都会发生自动转换,除非它是 的操作sizeof数、一元的操作数&或用于初始化数组的字符串文字。


推荐阅读