c - C 数组如何成为 “named variable in its own right” ?

标签 c language-concepts

在 Peter Van Der Linden 所著的“Expert C Programming: Deep C Secrets”一书中的第 103 页,有一张表介绍了数组和指针之间的区别。

一个问题我不太明白——直接引用:

Pointer: Typically points to anonymous data

Array: Is a named variable in its own right

这是什么意思?由于您可以执行以下操作:

#include <stdio.h>
#include <stdlib.h>

int main(void){
  int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int *y = malloc(9*sizeof(int));
  printf("sizeof(x) == %zu\n", sizeof(x));
  printf("&(x[2]) = %p\n", (void*)&(x[2]));
  printf("sizeof(y) == %zu\n", sizeof(y));
  printf("&(y[2]) = %p\n", (void*)&(y[2]));
  return 0;
}

输出:

sizeof(x) == 36
&(x[2]) = 0x7fffffffe5f8
sizeof(y) == 8
&(y[2]) = 0x800e18008

我不明白 yx 更像是一个命名变量。

最佳答案

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

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

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

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

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];

关于c - C 数组如何成为 “named variable in its own right” ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54612567/

相关文章:

Java OOP概念——接口(interface)和抽象类的正确使用?

r - 我们可以有更多的错误(消息)吗?

c - 在n皇后回溯中使用clock()测量时间

c - 存储 1 到 1000 素数的链表

c - 当通过管道提供 STDIN 时,getchar() 在 EOF 上循环

python - 生成器中存储的 'elements' 在哪里?

java - 构建Java控制台程序的正确方法

在自己的处理程序中捕获信号

c - 如何对在 Windows 中复制文件的最快方法进行基准测试(内存映射与文件 I/O)

r - R中的mode、storage.mode、typeof有什么区别(就思想而言)?