一、前言
前面一节我们已经讲过了有关于strlen在字符数组中的使用,以及strlen使用时候的注意事项
譬如只能在字符数组中使用,遇到'\0'才会停止,传过来的是地址,传值会出错等等之类的,不太
清除的小伙伴可以往回翻翻看看。那么废话不多说,咱们今天要讲的是sizeof在指针的使用。
二、sizeof在指针中的试题:
#include<stdio.h> int main() { char *p = "abcdef"; printf("%d\n", sizeof(p)); printf("%d\n", sizeof(p+1)); printf("%d\n", sizeof(*p)); printf("%d\n", sizeof(*p+1)); printf("%d\n", sizeof(p[0])); printf("%d\n", sizeof(&p)); printf("%d\n", sizeof(&p+1)); printf("%d\n", sizeof(&p[1]+1)); return 0;
题目简单分析:char *p = "abcdef",定义了一个指针去接受一个字符串常量,其中p只是接受了
字符串常量的首元素地址。而不是存放整个字符串的地址(因为是char型,人家根本存不下这么大
长一坨,只能存一个),事实上只要记住首元素地址就完全够了,因为可以通过首元素地址找到
整个字符串(因为字符串的地址也是连续存放的)。
解析:
第一题:sizeof(p),p是存放字符串的首地址,既然是地址,那就是4或8字节。(注意:这个可不是数组名呀,这个是指针,一定要注意区分)
第二题:sizeof(p+1),p是字符串常量的首元素地址,p+1就是第二个元素地址,还是地址那就是4或8字。(相信小伙伴们已经非常熟悉了吧,反正我已经讲烂了)
第三题:sizeof(*p),p表示首元素地址,*p表示拿到首元素的值了,且该元素的值是char类型的,所以大小是1字节。
第三题;sizeof(*p+1),这题其实之前已经讲过了,再讲一遍吧,*p表示的是首元素的值,其实就是a的值,所以为a+1,a是字符型,1是int类型,两者相加,会发生自动类型转化,char会自动转化为int(可以巧记为低字节转高字为自动,反之则是强迫),所以结果是a的ascll码值加一,得到98为整形,所以就相当于计算了整形的大小为4字节。
第四题:sizeof(p[0]),p[0]等价于*(p+0),所以表示的是首元素地址加0,还是首元素地址在*(首元素地址),得到的是首元素的值,为char类型所以大小是1字节。
第五题:sizeof(&p),&p是首元素地址,所以大小是4或8字节。
第六题:sizeof(&p+1),还是地址是第二个元素的地址,只要是地址结果就是4或8字节。
第七题:sizeof(&p[1]+1),&p[1]+1表示的是跳过第二元素的地址,即三个元素的地址,只要是地址,所以是4或8字节。
vs编辑器验证:
32位平台:
64位平台: