C 为什么sizeof运算符给出不同的输出
我正在学习C的基础知识,这是我即将学习的一门课程,现在我正在学习指针和数组。我一直在使用许多参考资料来学习它,但在这本“头先进入C”的书中,我有以下几点:C 为什么sizeof运算符给出不同的输出,c,arrays,pointers,C,Arrays,Pointers,我正在学习C的基础知识,这是我即将学习的一门课程,现在我正在学习指针和数组。我一直在使用许多参考资料来学习它,但在这本“头先进入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", size
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) */
所以我的问题是为什么这是不同的?如果这是一件非常基本的事情,我很抱歉,但是我还没有完全理解指针的概念。一个是数组的大小,另一个是指针的大小 数组和指针在C中是不同的类型,尽管数组和指针之间有隐式转换规则 由字符串文字初始化的数组的大小是空终止符的字符串的字符数+1
指向
char
(即char*
)的指针的大小是实现定义的对象大小,该对象的大小足以容纳指针值。一个是数组的大小,另一个是指针的大小
数组和指针在C中是不同的类型,尽管数组和指针之间有隐式转换规则
由字符串文字初始化的数组的大小是空终止符的字符串的字符数+1
指向char
(即char*
)的指针的大小是一个对象的实现定义的大小,该对象的大小足以容纳指针值。此语句
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) */
输出该数组占用的字节数
此声明
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) */
显示指针t占用的字节数。指针的大小通常为4或8字节,具体取决于使用的系统
此声明
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) */
显示字符的大小,因为表达式的类型为字符。在所有系统中,char类型对象的大小都等于1 这句话
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) */
输出该数组占用的字节数
此声明
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) */
显示指针t占用的字节数。指针的大小通常为4或8字节,具体取决于使用的系统
此声明
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) */
显示字符的大小,因为表达式的类型为字符。在所有系统中,char类型对象的大小都等于1 sizeof(s)
返回char
数组的大小,s
,长度为14char
s,加上一个空终止符;因此是15字节
sizeof(t)
返回char
指针t
的大小t
不知道s
的长度,因为当您从s
分配其值时,s
从数组类型衰减为指针类型,在过程中丢失长度信息。正如您所发现的,指针的大小可能因目标平台而异
sizeof(*s)
和sizeof(*t)
都取消对数组中第一个char
的地址的引用,生成一个char
sizeof(char)
==1,因为char
是每个定义的一个字节。sizeof(s)
返回char
数组的大小,s
,长度为14char
s,加上一个空终止符;因此是15字节
sizeof(t)
返回char
指针t
的大小t
不知道s
的长度,因为当您从s
分配其值时,s
从数组类型衰减为指针类型,在过程中丢失长度信息。正如您所发现的,指针的大小可能因目标平台而异
sizeof(*s)
和sizeof(*t)
都取消对数组中第一个char
的地址的引用,生成一个char
sizeof(char)
==1,因为char
是每个定义的一个字节。@MattMcNabb:说sizeof(*s)
让你想起t
是一个非序列的东西,不是吗?哦,是的。我以为它说的是sizeof(*t)
是出于某种原因。@MattMcNabb:说sizeof(*s)
会让你想起t
是一种非顺序的东西,不是吗?哦,是的。我以为它说的是sizeof(*t)
出于某种原因。@Deduplicator:Quare-Latinum?;)因为它看起来很漂亮。@deplicator:Quare-Latinum?;)因为它看起来不错。