sizeof
前言
sizeof
在C语言中,并非函数,也并非宏定义,而是运算符,优先级第一档。
之所以经常不加区分的认为这是函数,只是因为没有思考的使用过后就会自我取纳这样的想法。毕竟,它是那么像一个函数。
但是只要记住,它传变量的同时,还可以判断数据类型这一点,你就不应该将他认为是一个函数了。毕竟函数定义时候的形参可不能只是一个数据类型,况且它也不是一个字符串,我们无法匹配。(虽然函数调用中涉及的栈帧,可以通过寄存器的使用来达到不需要形参名的效果,但是这已经属于中间代码了,并非源代码)
因此,我们会发现,在实际使用的时候,我们也无法去看到sizeof的定义。因为他是编译原理中,较之函数更为底层的东西。但是可以通过源码查看。reference:GCC
使用
多多益善,多去对比使用,更多考察的是你对数据类型的了解。比如:数组和指针的结合。
short (*ptr[100])[200]
一个存储了100个指针的数组,而数组中的指针指向的都是大小200的另外数组
求ptr、ptr[0]、*ptr[0]、(*ptr[0])[0]的空间大小。
这是一个网络上很常见的试题,可以尝试做一下,代码验证。
sizeof编译期间确定,因此很多运行期间的动作都是无效的。
- 不要在sizeof()括号中,加上“动作”。它只是判断你的“状态”(静),不关心你的“行为”(动)。例如:sizeof(i++),i++不会生效
- 区分数组和指针,计算对象为内存空间大小,最小单位为字节。