我进行了彻底的搜索,但找不到解决方案:假设是sizeof(int) = 4,我们定义:
int a[10] = {0};以下内容的产出是什么?
sizeof(&a)sizeof(*a)sizeof(a)我知道sizeof(a)等于sizeof(int) * 10 = 40。
我还了解到,*a实际上是数组中的第一个元素,因此sizeof(*a)实际上是驻留在其中的int的大小,即4。
但是,在运行代码之后,我不明白为什么&a的大小是8。我知道'&'操作符返回变量a的地址,但是为什么sizeof地址是8
发布于 2019-08-08 07:21:53
地址的大小取决于您的体系结构,与int本身的大小没有直接关系。所以在你的例子中是8,这看起来很正常(64位)。
发布于 2019-08-08 07:44:30
理解这一点的关键是要知道,每当数组在表达式中使用时,它们通常会“衰减”为指向第一个元素的指针。除了一些特殊情况。在C标准(C17 6.3.2.1/3)中可以找到阵列衰减和异常的规则:
除非是
sizeof运算符的操作数,或一元&运算符,或者是用于初始化数组的字符串文字,否则类型‘类型数组’的表达式将转换为类型为‘指针到类型’的表达式,该表达式指向数组对象的初始元素,而不是lvalue。
正如我们所看到的,sizeof和&是规则的例外。
这意味着a在sizeof(&a)中不会衰减到指针。我们可以知道这一点,因为sizeof和一元&都是具有相同可信度的一元算子,但是具有从右到左的算子结合性。这意味着&a首先被解释,并且在使用&时没有数组衰减。
所以我们得到数组的地址。在您的示例中,类型为int(*)[10]的int指针的大小。指针的大小与int的大小无关,但在32位和64位系统中可能分别为4或8字节。
在sizeof(*a)的情况下,就像在&a情况下一样,一元运算符从严格到左的结合意味着*a首先得到解释。因此,在应用sizeof之前,数组确实会衰减为指向第一个元素的指针。因此,*a给出了第一个元素的大小,即一个int的大小。
最后,在sizeof(a)的情况下,由于a与sizeof一起使用,因此不存在阵列衰减,并且不存在其他操作符。意味着我们得到整个数组的大小。
发布于 2019-08-08 14:37:16
sizeof &a == sizeof (int (*)[10]) // pointer to 10-element array of int
sizeof *a == sizeof a[0] == sizeof (int)
sizeof a == sizeof (int [10])只是为了完整
sizeof &a[0] == sizeof (int *)所有这些大小都取决于底层平台。指针类型大小不取决于指向类型的大小( int和int *的大小之间没有关系)。不同的指针类型可能有不同的大小--唯一的要求是:
char *和void *具有相同的尺寸和排列;sizeof (const int *) == sizeof (int *);struct指针类型都具有相同的大小和对齐方式;union指针类型都具有相同的大小和对齐方式;在您可能遇到的任何现代桌面或服务器系统(read: x86)上,所有对象指针类型都具有相同的大小和对齐方式。请注意,有些奇怪的体系结构可能不是这样的。
https://stackoverflow.com/questions/57407161
复制相似问题