提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
一、简单概念
sizeof
sizeof是操作符,属于单目操作符,不是函数;sizeof是用来计算对象或所创建的对象占用内存空间的大小(单位为字节)。
strlen
strlen 是C语言库函数,用来计算字符串的长度。(遇到\0则停止计算)
注:使用时须引入头文件#include<stdio.h>
二、数组使用
首先,在介绍sizeof 与strlen在数组使用上的区别前,简单介绍一下关于数组名的概念:
一般情况下,数组名表示数组首元素的地址;
有且仅有两个例外:
1.sizeof(数组名):此时数组名表示整个数组,用来计算整个数组的大小,单位为字节;
2.&数组名:此时数组名表示整个数组,取出的是整个数组的地址。
1.一维数组
int a[]={1,8,2,4}
printf("%d\n",sizeof(a))//16 a作为数组名单独放在sizeof内部,计算的是数组的总大小
printf("%d\n",sizeof(a+0));//4/8 a并未作为数组名单独放在sizeof内部,a表示数组首元素的地址
//a+0还是数组首元素的地址,地址大小为4/8字节
printf("%d\n",sizeof(*a));//4 a表示数组首元素地址,*a为数组首元素,首元素大小为4字节
printf("%d\n",sizeof(a+1));//4/8 a表示数组首元素地址,a+1表示数组第二个元素的地址,是地址大小为4/8
printf("%d\n",sizeof(a[1]));//4 数组第二个元素,大小为4字节
printf("%d\n",sizeof(&a));//4/8 a表示整个数组,&a表示整个数组的地址,整个数组的地址也为地址
printf("%d\n",sizeof(*&a));//16 &a是数组的地址,为数组指针类型,解引用访问整个数组
printf("%d\n",sizeof(&a+1));//4/8 &a+1跳过整个数组,但本身还是地址
printf("%d\n",sizeof(&a[0]));//4/8 数组首元素地址
printf("%d\n",sizeof(&a[0]+1));//4/8 数组第二个元素的地址
int *p=a;//int*
int (*p)[4]=&a;//数组指针
2.字符数组
char arr[] = {'a','b','c','d','e','f'};
//sizeof
printf("%d\n", sizeof(arr));//6 arr是数组名,单独放进sizeof中,计算的是整个数组的大小
printf("%d\n", sizeof(arr+0));//4/8 arr是首元素地址,arr+0也是首元素地址
printf("%d\n", sizeof(*arr));// 1 arr为首元素地址,*arr为首元素
printf("%d\n", sizeof(arr[1]));//1 arr为首元素底子,arr[1]为数组第二个元素
printf("%d\n", sizeof(&arr));//4/8 arr表示整个数组,&arr为整个数组的地址
printf("%d\n", sizeof(&arr+1));//4/8 &arr为整个数组的地址,&arr+1跳过整个数组,指向'f'的后面,但本身还是地址
printf("%d\n", sizeof(&arr[0]+1));//4/8 arr为首元素的地址。&arr[0]为数组首元素的地址,+1跳过一个元素,为数组第二个元素的地址
//strlen
printf("%d\n", strlen(arr));//随机值 arr为数组首元素地址,strlen得到arr后,从arr数组首元素开始计算字符串的长度,遇到'\0'截止,但arr数组中没有'\0',arr内存的后面有无'\0'或者什么时候遇到'\0'都是不确定的,所以为随机值
printf("%d\n", strlen(arr+0));//随机值 arr 为数组首元素地址,arr+0依然为数组首元素地址
printf("%d\n", strlen(*arr));//err *arr为数组首元素'a',ASCII码值为97,strlen会把97当成地址访问,造成非法访问内存
printf("%d\n", strlen(arr[1]));//err arr[1]为数组第二个元素'b'
printf("%d\n", strlen(&arr));//随机值 arr表示整个数组,&arr表示整个数组的地址,数组的地址也是指向数组的起始位置,同strlen(arr)
printf("%d\n", strlen(&arr+1));//随机值 &arr+1跳过真个数组,来到'f'后面
printf("%d\n", strlen(&arr[0]+1));//随机值 &arr[0]+1跳过一个元素
char arr[] = "abcdef";
(数组有七个元素'a' 'b' 'c' 'd' 'e' 'f' '\0'
//sizeof
printf("%d\n", sizeof(arr));//7 arr表示整个数组
printf("%d\n", sizeof(arr+0));//4/8 arr表示数组首元素地址,arr+0仍然为数组
printf("%d\n", sizeof(*arr));//1 arr为数组首元素地址,*arr为数组首元素
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8 &arr为数组地址
printf("%d\n", sizeof(&arr+1));//4/8 &arr+1跳过整个数组
printf("%d\n", sizeof(&arr[0]+1));//4/8 &arr[0]+1跳过首元素
//strlen
printf("%d\n", strlen(arr));//6 arr为数组首元素地址,遇到'\0'中止
printf("%d\n", strlen(arr+0));//6
printf("%d\n", strlen(*arr));//err 非法访问
printf("%d\n", strlen(arr[1]));//err 非法访问
printf("%d\n", strlen(&arr));//6 &arr为整个数组地址,也是指向数组首元素的起始位置
printf("%d\n", strlen(&arr+1));//随机值 &arr+1跳过整个数组,arr内存后面不确定有无或什么时候遇到'\0'
printf("%d\n", strlen(&arr[0]+1));//5 &arr[0]+1跳过数组首元素,从数组第二个元素开始往后统计
3.二维数组
int a[3][4]={0}
sizeof(a)//48 a表示整个数组,计算的是整个数组的大小
sizeof(a[0][0])//4 表示数组首元素
sizeof(a[0])//16 把二维数组每一行当成一维数组 a[0]表示第一行的数组名,数组名单独使用在sizeof内部 表示数组第一行。计算的是二维数组第一行的大小
sizeof(a[0]+1)//4/8 a[0]并未单独放在sizeof内部 a[0]表示数组第一行的首元素地址,a[0]+1表示数组第一行第二个元素地址
sizeof(*(a[0]+1))//4 a[0]表示第一行首元素地址
sizeof(a+1)//4/8 数组第二行的地址
sizeof(*(a+1))//16
sizeof(&a[0]+1)//4/8跳过去整个第一行,第二行地址
sizeof(*(&a[0]+1))//16
sizeof(*a)//16
sizeof(a[3])//16
从上我们能够发现, sizeof()中的表达式不执行,sizeof只会判断表达式的最终类型。
代码演示:
char num = 1;
int a = 2;
printf("%d\n", sizeof(num = a++));//1
printf("%d %d", num, a);//1 2
结果:
总结
以上就是今天要讲的内容,本文简单介绍了sizeof 和 strlen的使用。
祝:健健康康顺顺利利!!!