Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么sizeof运算符给出不同的输出_C_Arrays_Pointers - Fatal编程技术网

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

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

我正在学习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", 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
,长度为14
char
s,加上一个空终止符;因此是15字节

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

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

sizeof(s)
返回
char
数组的大小,
s
,长度为14
char
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?;)因为它看起来不错。