为什么sizeof运算符给出不同的输出

时间:2014-07-27 22:13:18

标签: c arrays pointers

我正在学习C语言的基础知识,我正在学习一门课程,现在我正在学习指针和数组。我一直在使用一些参考文献来学习它,但在我的“Head First into C”一书中,有以下内容:

char s[] = "How big is it?"
char *t = s;
printf("%i\n", sizeof(s));  /* returns 15 */
printf("%i\n", sizeof(t));  /* returns 4 or 8 */

多数民众赞成,但如果我将最后一行更改为:

printf("%i\n", sizeof(*s));  /* returns 1 (on my compy anyway) */

所以我的问题是为什么会有所不同?如果它是一个非常基本的东西,请道歉,但我还没有把我的大脑包围在指针的概念中。

3 个答案:

答案 0 :(得分:3)

一个是数组的大小,另一个是指针的大小。

尽管数组和指针之间存在隐式转换规则,但数组和指针在C中是不同的类型。

由字符串文字初始化的数组的大小是空终止符的字符串+ 1的字符数。

指向char的指针的大小(即char *)是一个实现定义的对象大小,足以容纳指针值。

答案 1 :(得分:2)

本声明

printf("%i\n", sizeof(s));  /* returns 15 */

输出该数组占用的字节数。

本声明

printf("%i\n", sizeof(t));  /* returns 4 or 8 */

显示指针t占用的字节数。通常,指针的大小为4或8个字节,具体取决于使用系统。

本声明

printf("%i\n", sizeof(*s));  /* returns 1 (on my compy anyway) */

显示sizeof char,因为表达式*s的类型为char。在char的所有类型的对象的系统大小等于1.

答案 2 :(得分:2)

sizeof(s)返回char数组的大小s,长度为14 char,加上一个空终结符; ergo 15 bytes。

sizeof(t)返回char指针t的大小。 t不知道s的长度,因为当您从s分配其值时,s会从数组类型衰减到指针类型,从而丢失长度过程中的信息。正如您所发现的,指针的大小可能因目标平台而异。

sizeof(*s)sizeof(*t)都取消引用数组中第一个char的地址,产生一个charsizeof(char) == 1,因为每个定义char是一个字节。