arrays - C语言中数组变量是如何存储的? (不是内存本身,而是命名变量中的指针)

标签 arrays c pointers

有一段时间,我假设存储数组的变量实际上只是指向数组第一个元素的指针,例如 char argv[][]char **argv 似乎可以互换,但最近了解到 sizeof 运算符正确返回底层数组的大小。那么数组变量是否存储为宽指针?为什么将数组传递给函数时 sizeof 会失败?

我很抱歉这可能有点,但作为一个来自低级 Rust 的人,C 中的数组真的让我感到困惑。

最佳答案

How are array variables stored in C? (not the memory itself but the pointer in the named variable)

数组的存储方式与其他对象类似:intstruct 等。每个数组都存在于内存中,从某个地址开始*1并占用 sizeof object 字节。

一个对象,无论是否是数组,都有一个地址。数组的每个元素都有一个地址。

are array variables stored as wide pointers?

没有。

Why does sizeof fail when the array is passed to a function?

sizeof 不会失败。就是当数组传递给函数时,它首先被转换为第一个元素的类型和地址。该函数接收一个指针,而不是一个数组。下面打印数组 a 的大小(例如 12),然后打印指针 ptr 的大小(例如 2、4 或 8)。期望 sizeof ptr 为数组的大小并不是语言方面的失败。

int foo(int *ptr) {
  printf("%zu\n", sizeof ptr);
  return 0;
}

int main() {
  int a[3] = { 1,2,3,};
  printf("%zu\n", sizeof a);
  return foo(a);
}

arrays in C are really confusing me.

记住数组不是指针并且指针不是数组是有用的。

Is there a reason why you can't pass an array as an argument like in rust and why it always decays?

...因为C语言就是这样定义的。它在当时被认为是一个很好的设计,并且经过 40 多年的使用,至少是一个合理的选择。


*1 存储在寄存器中的对象没有地址。

关于arrays - C语言中数组变量是如何存储的? (不是内存本身,而是命名变量中的指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76617676/

相关文章:

java - Java 中使用 BigDecimal 的二维数组

c - char *val 和 char *** val 有什么区别?

c - C中使用不同维度数组的指针数组等价

python - 在 python 中平均多个掩码 numpy 数组

c - 使用Wifi模块ESP8266发送UDP广播消息

c - 如何丢弃在 sleep 功能期间传递的用户输入?

c++ - 销毁存储在指针 vector 中的对象

c - 函数调用后指针值丢失 - C

c - 从指向字符串的指针数组访问字符串的字符

c++ - 将指针作为对数组的引用传递