sizeof与strlen的使用

注意:

1.数组名单独放在sizeof()内部,数组名表示整个数组,所以sizeof(数组名)计算的是整个数组的大小,单位是字节

2.&数组名,数组名表示整个数组,所以&数组名取出的是整个数组的地址

3. 除此之外,所有的数组名都表示首元素的地址

4.地址的大小都是4个字节(这里是用的32位制,64位制的是8字节)

5.strlen是求字符串长度,数组中没有“\0“不会停止

一维数组

int a[] = {1,2,3,4}

 printf("%d\n",sizeof(a));

16字节(数组名“a”单独放在sizeof里,求的是数组的总大小,符合第一条,数组里有4个整型元素,每个元素的大小是4字节,所以总共16字节)
printf(“%d\n”,sizeof(a+0));
4字节(“a+0”没有单独存放,所以符合第三条,这里求的是首元素的地址,所以是4字节,地址的大小都是4字节)
printf(“%d\n”,sizeof(*a));
4字节(“a”没有单独存放,所以这里是首元素的地址,而*又是取地址,所以“*a”是指对首元素的地址取地址,即首元素,首元素是整型,所以是4字节)
printf(“%d\n”,sizeof(a+1));
4字节(“a”没有单独存放,所以符合第三条,而“a+1”就是首元素在加一,即第二个元素,整型的大小是4个字节)
printf(“%d\n”,sizeof(a[1]));
4字节(“a[1]”指数组中的第二个元素,还是整型,所以是4个字节)
printf(“%d\n”,sizeof(&a));
4字节(“&a”指的是取出整个数组的‘地址’,符合第二条,只要是地址,大小都是4字节)
printf(“%d\n”,sizeof(*&a));
16字节(“&a” 指的是取出整个数组的‘地址’,而又是取地址,所以“&a”是指对取出的整个数组的地址取地址,即整个数组,这个整型数组的大小就是16字节)
printf(“%d\n”,sizeof(&a+1));
4字节(“&a” 指的是取出整个数组的‘地址’,“&a+1”是指跳过整个数组的地址,但还是地址,地址的大小都是4字节)
printf(“%d\n”,sizeof(&a[0]));
4字节(“&a[0]”是指对数组中的第一个元素取地址,只要是地址都是4字节)
printf(“%d\n”,sizeof(&a[0]+1));
4字节(“&a[0]”是指对数组中的第一个元素取地址,“&a[0]+1”就是对第二个元素取地址,地址的大小都是4字节)
这里写图片描述

字符数组

char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};

printf("%d\n", strlen(arr)); 

随机值(这里的数组没有“\0“,所以不知道找到哪里会停止,所以就是随机值)
printf(“%d\n”, strlen(arr+0));
随机值(“arr+0“不符合第一、二条,所以是首元素地址,从首元素的地址开始计数,没有”\0“,还是随机值,与上面的随机值相同)
printf(“%d\n”, strlen(*arr));
错误(传给strlen的是一个地址,就从这个地址开始数,“*arr”是首元素地址,即字符‘a’,现在就相当于把字符‘a’当地址看,‘a’的ASCLL码是97,相当于从97开始数字符,这个是不对的)
printf(“%d\n”, strlen(arr[1]));
错误(“arr[1]”是数组中的第二个元素,传给strlen的还是一个地址,相当于从字符‘b’这个地址开始数字符,字符‘b’的ASCLL码为98,程序无法执行,即错误的)
printf(“%d\n”, strlen(&arr));//随机值
随机值(“&arr”是取出的是数组的地址,和取首元素的地址一样,由于没有“\0”,不知道会数到哪里停下来,所以是随机值)
printf(“%d\n”, strlen(&arr+1));
随机值(“&arr+1”是指取出的数组地址跳过一个数组开始数,还是因为没有“\0”,所以也是随机值,只是比上面的随机值少一个数组的长度)
printf(“%d\n”, strlen(&arr[0]+1));
随机值(“&arr[0]+1”是指对数组中的第二个元素取地址,这里相当于从‘b’往后数,还是没有“\0”,仍然是随机值,只是比从首元素开始数的少一个元素的长度)
这里写图片描述

printf("%d\n", sizeof(arr));

6字节(“arr”单独放在数组里,符合第一条,是整个数组的大小,字符型元素的大小是1个字节,所以是一共6个字节)
printf(“%d\n”, sizeof(arr+0));
4字节(“arr+0“没有单独存放,所以符合第三条,是首元素的地址,地址的大小都是4个字节)
printf(“%d\n”, sizeof(*arr));
1个字节(“arr“没有单独存放,是指首元素的地址,”*arr“是指对首元素的地址取地址,即首元素,这是字符型,所以是1个字节)
printf(“%d\n”, sizeof(arr[1]));
1个字节(“arr[1]“是指第二个元素,字符型的元素大小是1个字节)
printf(“%d\n”, sizeof(&arr));
4个字节(“&arr“是指取出的是整个数组的地址,地址的大小都是4字节)
printf(“%d\n”, sizeof(&arr+1));
4个字节(“&arr“是指取出的是整个数组的地址,“&arr+1“是指跳过一个数组的地址,还是地址,地址的大小都是4个字节)
printf(“%d\n”, sizeof(&arr[0]+1));
4个字节(“&arr[0]“是取第一个元素的地址,+1是指取第二个元素的地址,地址的大小都是4个字节)
这里写图片描述

char arr[] = “abcdef”;

printf("%d\n", strlen(arr));

6个字节(一共7个元素,包含“\0”,数到“\0”会停下来,所以求得6个字节)
printf(“%d\n”, strlen(arr+0));
6个字节(“arr+0”指取首元素的地址,从‘a’开始数,数到“\0”自动停止,所以还是6个字节)
printf(“%d\n”, strlen(*arr));
错误(传给strlen的是一个地址,就从这个地址开始数,“*arr”是首元素地址,即字符‘a’,现在就相当于把字符‘a’当地址看,‘a’的ASCLL码是97,相当于从97开始数字符,这个是不对的)
printf(“%d\n”, strlen(arr[1]));
错误(“arr[1]”是数组中的第二个元素,传给strlen的还是一个地址,相当于从字符‘b’这个地址开始数字符,字符‘b’的ASCLL码为98,程序无法执行,即错误的)
printf(“%d\n”, strlen(&arr));
6个字节(“&arr”是取整个数组的地址,和取首元素的地址一样,但strlen数字符只看位置,当前位置是首元素所在的,数到“\0”自动停止,所以还是6个字节)
printf(“%d\n”, strlen(&arr+1));
随机值(“&arr+1”是指取出的数组地址跳过一个数组开始数,当前数组只有7个元素,跳过这个数组之后没有“\0”,不知道数到哪里会停止,所以是随机值)
printf(“%d\n”, strlen(&arr[0]+1));
5个字节(“&arr[0]+1”是指对数组中的第二个元素取地址,但strlen数字符只看位置,不看类型,所以相当于从‘b’开始数字符,数到“\0”自动停止,所以是5个字节)
这里写图片描述

printf("%d\n", sizeof(arr));

7个字节(求整个数组的长度,这个数组里是包含“\0”的,所以是7个字节)
printf(“%d\n”, sizeof(arr+0));
4个字节(不符合第一、二条,符合第三条,指取首元素的地址,只要是地址都是4个字节)
printf(“%d\n”, sizeof(*arr));
1个字节(“arr”在这里指取首元素的地址,“*arr”就是首元素了,字符型的元素大小为1个字节)
printf(“%d\n”, sizeof(arr[1]));
1个字节(“arr[1]”指数组中的第一个元素,字符型元素大小为1个字节)
printf(“%d\n”, sizeof(&arr));
4个字节(“&arr”指取出的是整个数组的地址,只要是地址都是4个字节)
printf(“%d\n”, sizeof(&arr+1));
4个字节(“&arr+1”指取出的整个数组的地址跳过一个数组,仍然是地址,地址的大小都是4个字节)
printf(“%d\n”, sizeof(&arr[0]+1));
4个字节(“&arr[0]+1”指取数组中的第一个元素的地址跳过一个元素,仍然是地址,地址的大小都是4个字节)
这里写图片描述

char* p = “abcdef”;

printf("%d\n", strlen(p));

6个字节(“p”里面存的是‘a’的地址,这里是有“\0”的,往后数会遇到“\0”,所以是6个字节)
printf(“%d\n”, strlen(p+1));
5个字节(“p”里面存的是‘a’的地址,“p+1”里面存的就是‘b’的地址了,往后数遇到“\0”就是5个字节了)
printf(“%d\n”, strlen(*p));
错误(“*p”是字符‘a’,传给strlen是错误的)
printf(“%d\n”, strlen(p[0]));
错误(“p[0]”也是字符‘a’,依然是错误的)
printf(“%d\n”, strlen(&p));
随机值(“&p”取出的是整个数组,从这里往后数不知道什么时候会停下来,所以是随机值)
printf(“%d\n”, strlen(&p+1));
随机值(“&p+1”是取出的整个数组跳过一个数组往后数,依然不知道数到哪里会停下来,还是随机值,只是比上一个少一个数组的长度)
printf(“%d\n”, strlen(&p[0]+1));
5个字节(“&p[0]+1”是取出的是‘b’的地址,相当于从‘b’之后往后数,遇到“\0”停止,所以是5个字节)
这里写图片描述
printf(“%d\n”, sizeof(p));
4个字节(“p”是指针变量,里面存放的是地址,地址的大小都是4个字节)
printf(“%d\n”, sizeof(p+1));
4个字节(“p+1”是跳过一个字符的地址,即‘b’的地址,地址的大小都是4个字节)
printf(“%d\n”, sizeof(*p));
1个字节(“p”是字符指针,里面存放的是一个字符,“*p”即这个字符,一个字符的大小就是1个字节)
printf(“%d\n”, sizeof(p[0]));
1个字节(“p[0]”就是第一个字符,字符的大小就是1个字节)
printf(“%d\n”, sizeof(&p));
4个字节(“&p”取出的是指针变量”p”的地址,“p”里面存放的是地址,地址的大小都是4个字节)
printf(“%d\n”, sizeof(&p+1));
4个字节(“&p+1”是取出”p”的地址跳过一个指针变量的位置,仍然是地址,地址的大小就是4个字节)
printf(“%d\n”, sizeof(&p[0]+1));
4个字节(“&p[0]”取出的是‘a’的地址,再+1取出的就是‘b’的地址,地址的大小都是4个字节)
这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值