我正在学习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) */
所以我的问题是为什么会有所不同?如果它是一个非常基本的东西,请道歉,但我还没有把我的大脑包围在指针的概念中。
答案 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
的地址,产生一个char
。 sizeof(char)
== 1,因为每个定义char
是一个字节。