首先明确,sizeof不是一个函数,它是一个运算符!
1 | char str[] = "Hello"; |
64 位机上,分析一下输出结果。
-
字符数组的大小包括 ‘\0’,“Hello” 有 5 个字符,加上 ‘\0’,
sizeof(str)
大小为6。 -
64 位机,因为寻址的原因,需要8个字节来存储指针的大小,因此
sizeof(pstr)
的大小为8。 -
最困惑的要属
sizeof(str_list)
了。一开始认为,字符数组指针也是指针,所以输出应该是 8,但程序输出的结果却是 16。经查证,[]
的优先级比*
要高,因此str_list
先和[]
结合,它还是一个数组,数组中的元素是char *
。这个数组有两个元素,一个是指向常量 “Hello” 的指针,一个是指向常量 “world” 的指针,每个指针的大小都是 8,因此输出是 16。 -
void*
本质也是一个指针,因此sizeof(pbuf)
的大小也为8。 -
int
类型在 64 位机上占 4 字节的存储空间,因此sizeof(n)
的大小为4。
这里我一直有一个错误的认识。比如,int n[] = {1, 2, 3, 4};
而我们知道,对于像这样的数组来说,&n[0]
和 &n
表示的都是这个数组的第一个元素的地址,我之前一直想当然的认为 sizeof(n)
表示的也是这个数组第一个元素的大小。这显然是错误的!!