关于数组中的sizeof和strlen
来源:互联网 发布:小米电视有线网络ip 编辑:程序博客网 时间:2024/04/30 16:40
sizeof()求得是变量或者空间开辟空间的大小,而strlen()函数参数接收的必须是一个有效地址
一:一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16 当arr单独放在sizeof()的时候代表整个数组,因为数组中有4个元素,而每个元素都是整型,都有四个字节,所以4*4=16字节.
printf("%d\n",sizeof(a+0));//4 表示首元素的地址,而地址占4个字节。
printf("%d\n",sizeof(*a));//4 首元素所占空间的大小,一个整型,4个字节
printf("%d\n",sizeof(a+1));//4 首元素的地址+1,还是地址。所以为4个字节
printf("%d\n",sizeof(a[1]));//4 指向的是数组中的第二个元素,一个整型,大小为4
printf("%d\n",sizeof(&a));//4 表示整个数组的地址,数组地址也是地址,所以大小为4
printf("%d\n",sizeof(*&a));//16(*&a)等价于a,所以代表是整个数组,所以大小为16
printf("%d\n",sizeof(&a+1));//4 跳过整个数组后的下一个地址,还是4个字节
printf("%d\n",sizeof(&a[0]));//4 数组首元素的地址,还是4个字节
printf("%d\n",sizeof(&a[0]+1));//4 指向第二个元素的地址
二 字符数组
char arr[] = {'a','b','c','d','e','f'};
(1)sizeof
printf("%d\n", sizeof(arr));//6 表示整个数组的大小,因为为char型,所以1*6=6
printf("%d\n", sizeof(arr+0));//4 表示数组首元素的地址,大小为4个字节
printf("%d\n", sizeof(*arr));//1 首元素所占空间的大小,char型,1个字节
printf("%d\n", sizeof(arr[1]));//1 指向数组中的第二个字符,大小为1个字节
printf("%d\n", sizeof(&arr));//4 表示整个数组的地址,数组地址也是地址,所以大小为4个字节
printf("%d\n", sizeof(&arr+1));//4 跳过整个数组后的下一个地址,大小为4个字节
printf("%d\n", sizeof(&arr[0]+1));//4 第二个元素的地址,还是4个字节
(2)strlen
printf("%d\n", strlen(arr));//随机值19 不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值
printf("%d\n", strlen(arr+0));//随机值19 从数组首元素‘a’开始,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值
printf("%d\n", strlen(*arr));//err 系统崩溃,因为字符a不是一个有效地址
printf("%d\n", strlen(arr[1]));//err 系统崩溃,因为字符b不是一个有效地址
printf("%d\n", strlen(&arr));//随机值19 先找到整个数组的地址(也可以说是数组首元素的地址)然后从第一个字符开始往后找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值
printf("%d\n", strlen(&arr+1));//随机值13 跳过整个数组后开始往后找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值,因为数组的长度为6,所以19-6=13
printf("%d\n", strlen(&arr[0]+1));//随机值18 从数组的第二个字符开始往后找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值,因为‘a’的长度为1,所以19-1=18
char *p = "abcdef";
(1)strlen
printf("%d\n", strlen(p));//6 p存的是字符'a'的地址,从a开始遇到'\0'结束。所以为6个字节(不包括\0)
printf("%d\n", strlen(p+1));//5 指向的是第二个字符‘b’,从b开始遇到'\0'结束。所以为5个字节(不包括\0)
printf("%d\n", strlen(*p));//err 系统崩溃,因为字符a不是一个有效地址
printf("%d\n", strlen(p[0]));//err 系统崩溃,因为字符a不是一个有效地址
printf("%d\n", strlen(&p));//随机值x 从p的地址开始往后面找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值
printf("%d\n", strlen(&p+1));// 随机值 从p的地址后面的一个地址开始往后面找,不知道什么时候会遇到'\0'或者0或者NULL结束,所以为随机值
printf("%d\n", strlen(&p[0]+1));//5 从第二个元素开始往后找,遇到'\0'结束。所以为5个字节(不包括\0)
(2)sizeof
printf("%d\n", sizeof(p));//4 p中存放的a的地址,地址大小为4个字节
printf("%d\n", sizeof(p+1));//4 地址+1之后还是地址,大小为4个字节
printf("%d\n", sizeof(*p));//1 ‘a’字符所占空间的大小为1个字节
printf("%d\n", sizeof(p[0]));//1 ‘a’字符所占空间的大小为1个字节
printf("%d\n", sizeof(&p));//4 表示指针变量p的地址还是地址,大小为4个字节
printf("%d\n", sizeof(&p+1));//4 指针变量p的地址后面的一个地址,还是4个字节
printf("%d\n", sizeof(&p[0]+1));//4 字符'a'后面一个字符'b'的地址,还是地址,大小为4个字节。
总结:(1)只要是地址,不论是整型数组还是字符数组,在32位平台上,都是4个字节。
(2)地址+一个整数还是地址,大小为4个字节。
(3)在计算strlen的时候,不包括0或者'\0'或者NULL。
(4)在32位的平台上指针的大小是4个字节。
- 关于数组中的sizeof和strlen
- 数组中的strlen和sizeof
- c语言中的数组sizeof和strlen
- 关于sizeof 和strlen
- 关于sizeof和strlen !!!
- 关于sizeof和strlen
- 关于sizeof和strlen !!!
- 关于strlen 和 sizeof
- 关于sizeof和strlen !!!
- 关于sizeof和strlen
- 关于strlen和sizeof
- strlen()&sizeof在静态数组和动态数组中的应用~
- 发现关于数组求其长度 strlen 和 sizeof的问题
- 关于字符数组,字符指针 strlen和sizeof总结
- 了解sizeof和strlen以及关于数组的相关计算
- 关于数组的 sizeof和strlen 的一些计算
- 关于数组名在sizeof内部和在strlen内部
- 数组的sizeof和strlen
- 栅格系统
- DJI manifold 制作和恢复镜像命令
- jquery对表单元素的一些操作
- 排序算法的分类及如何选择
- UVA
- 关于数组中的sizeof和strlen
- JavaWeb&Tomcat环境配置(Intellij IDEA)
- rar密码加密文件破解方法
- Java CountDownLatch应用
- 机器学习中的概率问题
- Redis-Hash
- mysql5.7主从复制--在线变更复制类型
- 常用十进制与二进制,八进制,十六进制转换。
- Android基础中四种点击事件的实现及接口回调