【问题标题】:If an array_name is a pointer how isnt int *ptr = array_name not a pointer to a pointer如果 array_name 是一个指针 int *ptr = array_name 不是指向指针的指针
【发布时间】:2021-04-01 12:03:57
【问题描述】:

我是 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,使其本质上指向一个指针。

【问题讨论】:

  • 这能回答你的问题吗? Assigning char array to pointer
  • 不,在ptr = x; x 将衰减指针表达式(即:具有类型 `指向 int 的指针)
  • 你可能会喜欢comp.lang.c faq的第6部分。
  • @prehistoricpenguin 并不是我已经熟悉了这样一个事实,即 &array_name 指的是整个数组,而 array_name 指的是数组的第一个元素
  • @pmg 感谢这篇文章很有帮助

标签: c pointers


【解决方案1】:

数组不是指针。

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

int SomeInt;
int *a = &SomeInt;

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

int *b;
b = a;

这是做什么的?它将b 设置为等于a。它不会使b 指向a。在这个赋值之后,ba的值相同,所以b指向同一个地方a指向;它指向SomeInt。它不指向a

同样,您的ptr = x; 不会使ptr 指向x。它使ptr 等于表达式x 的值。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2011-04-24
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    相关资源
    最近更新 更多