sizeof和strlen

来源:互联网 发布:刘涛二手衣店淘宝网址 编辑:程序博客网 时间:2024/06/06 14:26

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

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


例题说明:

1,整型数组


int a[]={1,2,3,4};printf("%d\n",sizeof(a));-----16//a表示整个数组的地址,在32位系统下,所有地址均占4个字节,所以结果为16printf("%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//跳过整个数组的下一个地址,因为是地址,所以结果仍为4printf("%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
原创粉丝点击