4
4

4 回答 4

3

我同意,作者在这里可以更清楚。指针本身也是一个命名变量,但如果它指向一个数组,它就没有关于数组长度的任何信息。事实上,它并不知道它指向的是一个数组。p[100]即使p分配了单个int或其他数据类型的地址,语法也是有效的(尽管未定义)。

这就是为什么当数组作为参数传递给函数时,它是:

  • 附带一个“长度”参数,该参数信任调用代码以正确提供它
  • 以标记值终止(如字符串的空终止符)

为了更清楚地展示这种区别,试试这个:

int arr[3] = { 1,2,3 };
int *ptr;
ptr = &arr;

我收到以下编译警告:

'=': 'int *' differs in levels of indirection from 'int (*)[3]'

但是,如果您更改ptr为指向arr的第一个元素(这是衰减到指针时发生的情况arr),则没有问题:

ptr = &arr[0];
于 2019-02-10T01:44:16.470 回答
2

我认为作者想说的是,数组的元素形成了一个命名的“对象”(根据 C 标准的定义),而指针的元素通常来自一个未命名的“对象”。

有关对象的定义,请参见 C11 §3.15,有关对象存储持续时间的信息,请参见 §6.2.4。

那里有很多蹩脚的编程书籍,而 C 作为一种古老而流行的语言,它的内容比大多数都多。

于 2019-02-10T01:54:23.453 回答
0

我们基本上是在猜测别人的意思。但这是我最好的猜测。

  int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int *y = malloc(9*sizeof(int));

x是数组的名称。

y是指针的名称。它指向的数组没有名字。

于 2019-03-18T23:05:19.977 回答
-2

实际上,你写的是两种声明数组的方法。当然,第一个更传统和更容易。作者试图告诉我们的是,数组是命名变量,因为您需要命名变量来访问数组的所有元素。要到达下一个元素等等,您需要放置索引号。因此,第一个元素的“地址”乘以索引号,您将得到所需的元素。如果我们分析它,array[0] 指向第一个元素,它本身就是一个指针。

但是,要正确理解指针,请考虑以下内容:

int *y = malloc(sizeof(int));
int x[] = {1,2,3};
y = &x[2]; //points to an anonymous data because pointer "y" doesn't "know" the 
           //variable "x", only it's memory address
y = &x[0]; //points to the first element of x
于 2019-02-10T02:36:35.700 回答