sizeof和strlen

sizeof:判断数据类型长度符的关键字,用于求取一个对象或者类型所占的内存字节数

strlen:求取字符串长度的函数,不包括‘\0’


例题说明:

1,整型数组


int a[]={1,2,3,4};
printf("%d\n",sizeof(a));-----16//a表示整个数组的地址,在32位系统下,所有地址均占4个字节,所以结果为16
printf("%d\n",sizeof(a+0));----4//a+0表示第一个元素的地址,在32位系统下,所有地址均占4个字节
printf("%d\n",sizeof(*a));----4//对数组的第一个元素进行a[0]进行解引用,一个整型元素在内存中占4个字节
printf("%d\n",sizeof(a+1));----4/第二个元素a[1]的地址
printf("%d\n",sizeof(a[1]));----4//第二个元素a[2]的值
printf("%d\n",sizeof(&a));----4//整个数组的地址,(它同样指向a[0]的地址,但与a+0的意义却大不相同)
printf("%d\n",sizeof(&a+1));----4//跳过整个数组的下一个地址,因为是地址,所以结果仍为4
printf("%d\n",sizeof(&a[0]));----4//第一个元素a[0]的地址
printf("%d\n",sizeof(&a[0]+1));----4//第二个元素a[1]的地址
printf("%d\n",sizeof(*&a));----16//对整个数的地址进解引用,相当于a

 

如果仔细观察就会发现,一直推崇的数组名代表数组首元素的地址在以上求值中好像并不适用,是的,我们不得不注意一个知识点,那就是数组名

在两种情况下并不代表数组首元素的地址,1:sizeof(a)   -----求整个数组所占的字节数

                                                                            2:&a------整个数组的地址

          

由以上截图可知,虽然前两行的取值相同,但意义完全不一样,加1后一个跳到了第二个元素,一个却跳过了整个数组

2,字符数组

    char name[]="abcdef";

printf("%d\n",sizeof(name[0]));//1----数组第一个元素即字符a所占字节数
printf("%d\n",sizeof(&name));//4----整个数组的地址
printf("%d\n",sizeof(*name));//1----数组
printf("%d\n",sizeof(&name+1));//4----第一个元素所占的字节数
printf("%d\n",sizeof(name+1));//4----数组的下一块地址
printf("%d\n",sizeof(name));//7----整个数组字符串所占的字节数,包括‘\0’

printf("%d\n",strlen(name));//6----求字符数组的长度,不包括‘\0’
printf("%d\n",strlen(&name));//6----从第一个元素开始求取字符串长度,直到遇见‘\0’
printf("%d\n",strlen(&name+1));//随机值----从数组下一块空间的地址开始求字符串长度,由于‘\0’的位置不确定,所以结果为随机值
printf("%d\n",strlen(name+1));//5----从数组第二个元素即b开始,求字符串长度,直到遇见‘\0’


3,字符指针

<pre name="code" class="cpp">char *name="abcdef";

printf("%d\n",sizeof(name[0]));//1----求字符a所占字节
printf("%d\n",sizeof(&name));//4----字符指针name本身的地址所占字节
printf("%d\n",sizeof(*name));//1----通过地址解引用求字符a所占字节
printf("%d\n",sizeof(&name+1));//4----整个字符指针的下一块空间的地址
printf("%d\n",sizeof(name+1));//4----字符b的地址
printf("%d\n",sizeof(name));//4----字符a的地址

printf("%d\n",strlen(name));//6----从字符a开始求字符串长度,遇见‘\0’停止
printf("%d\n",strlen(&name));//随机值----代表指针name本身的地址,由于‘\0’的位置不确定,所以是随机值
printf("%d\n",strlen(&name+1));//7----表示指针name本身地址的下一块地址,‘\0’不确定,随机值
printf("%d\n",strlen(name+1));//5----从字符b开始求取字符串长度,直到遇见‘\0’

 
 





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值