c
中有一些我无法理解的东西。
以下代码:
#include <stdio.h>
int main(char* args){
char abc[100];
printf("%d %d", sizeof(abc), sizeof(abc+1));
}
输出
100 4
我认为它应该生成100 100-1
,即:
100 99
int abc[100]
相同。
它输出
400 4
而不是
400 396
编辑:
好的,所以我看到了你的命令。表达式中的abc + 1。因此,结果是int,sizeof(int) == 4
。所以我的另一个问题是为什么我第一次发送一个数组指针,结果是数组的长度?
以下内容:
int main(char* args){
char abc[100];
char *test;
test = (char*)abc+1;
printf("%d %d", sizeof(abc), sizeof(test));
}
输出
100 4
答案 0 :(得分:9)
表达式
abc+1
是一个指针。因此,您的指针似乎是4个字节宽。
另一方面,表达式
abc
是一个长度为100的char数组,因此它的大小为100。
至于使用int而不是char的版本,我相信你现在可以应用上述推理来解释输出。
我认为你对问题的编辑基本上要求:
为什么
abc+1
是指针,abc
是数组。
标准说:
其他操作数 - 左值,数组和函数指示符(ISO / IEC 9899:201x 6.3.2.1/3)
除非它是sizeof运算符的操作数,否则_Alignof 操作员,或一元&amp;运算符,或者是用于的字符串文字 初始化一个数组,一个类型为“数组类型”的表达式 转换为类型为''指向类型'指针的表达式 到数组对象的初始元素,而不是左值。如果 数组对象有寄存器存储类,行为是 未定义。
因此,当您编写sizeof(abc)
时,abc
不符合将表达式abc
转换为指针所需的条件。所以abc
被视为一个数组。但是在表达式sizeof(abc+1)
中,abc+1
不符合任何列出的异常,因此转换为指针。
通俗地说,这被称为衰减为指针的数组。
答案 1 :(得分:6)
abc+1
是一个指针;因此它的大小是指针或地址的大小,在你的系统上是4
。
请注意,指针的大小取决于平台。
正如一条评论警告:“在Windows 64上,指针大于long
的大小。”
你也会问为什么它首先给你100,如果它给你4后。
数组就像指针但不是指针。当您第一次编写sizeof(abc)
时,它不是编译指针的大小,而是数组的大小。这就是为什么它在第一次尝试时给你100分。
答案 2 :(得分:1)
这很好。
由于数组的名称是只读指针,它指的是数组中第一个元素的地址。 每当可行算术运算符(++, - ,+, - ) 或返回应用于数组时,它将被视为< EM>指针。
sizeof 是一个运算符,它返回类型或变量或文字的块大小(以字节为单位)
当你使用 sizeof(数组)
时
它返回100.
因为数组的块大小是100
你没有应用任何算术,所以数组被视为数组。
当你使用 sizeof(array + 1)
时
它返回4(机器中指针的大小)
它被视为指针,因为应用了算术运算,指针的块大小相当于长大小(可能会有所不同)。
答案 3 :(得分:0)
我的第二个问题的答案是sizeof
是compiler time operator
。
因此,他知道定义数组的大小,如char abc[100];
但他并不真正知道指向数组的指针的大小。像char *test = abc
;我的意思是数组的长度不会保存在内存中。