C++ 数组和指针的 sizeof 结果

Result of sizeof for C++ arrays and pointers

在x86_64 体系结构中,指针为 8 个字节。我觉得 sizeof(x) 应该 return 8. 我理解 char 是一个字节,5 个字节是数组 z 的大小。为什么 sizeof(z) 不是 return 8 背后的直觉是什么?

int* x = new int[10];
char z[5];

// Returns 8
std::cout << "This is the size of x: " << sizeof(x) << std::endl;

// Returns 5
std::cout << "This is the size of z: " << sizeof(z) << std::endl;

What is the intuition behind why sizeof(z) does not return 8?

z 不是指针。因此 sizeof(z) 不是什么,而是 5 个字节。在 sizeof 的情况下,数组不会衰减为指针。参考:What is array decaying?


C++ 中有几种隐式转换,如数组到指针、枚举到整数、doublefloat、派生到基数、任何指针到 void* 等等。这可能会让我们思考它们的尺寸是否相同或什么?
因此,自我理解的试金石是创建指针引用并尝试分配其他类型。对于不匹配的类型,它会导致错误。例如

int *x = new int[5], *&px = x; // OK
int z[5], *&pz = z; // error: can't initialize

每个字符的大小都是'1' 假设当你编译它时

 //It returns 1
      char z='a';
     std::cout << "This is the size of z: " << sizeof(z) << std::endl;
//It returns 5 because it is an array of 5 characters
 char z[5];
std::cout << "This is the size of z: " << sizeof(z) << std::endl;

您已将 x 定义为指向 char 的指针,因此 sizeof(x) 产生指向 char 的指针的大小。在当前的实现中,通常是 32 位或 64 位。 char 通常是 8 位,因此您可以期望 sizeof(char *) 在大多数当前编译器上产生 4 或 8。

您已将 z 定义为 5 个字符的数组,因此 sizeof(z) 生成 5 个字符的数组的大小。由于数组的元素是连续的,并且 sizeof(char) 保证为 1,因此显而易见的值为 5。

如果(例如)将 5 个字符的数组放入结构中,然后是(比如)int,编译器很有可能会在这两个元素之间插入一些填充.

当你传递一个数组名给sizeof时,你想知道有多少"bytes"数据属于这个数组。

当你传递一个指针给sizeof时,你想知道这个指针占用了多少"bytes"

将数组名作为函数参数传递时,差异非常明显。在这种情况下,函数无法看到数组占用的整个数据区域。它只看到 "pointer" 类型。