前言:许多初学者学习c语言时,遇到sizeof和strlen常常会头疼,这里我给大家整理了常见的sizeof和strlen习题,希望能够帮助到大家,敲代码不易,关注一下,谢谢支持
1.sizeof() 计算操作数所占空间的字节数大小,是一种运算符。可以以类型、指针、数组和函数作为参数。单位是字节
注意!!!(非常重要)
1.sizeof(数组名)计算的是整个数组在内存中的大小;
2.&数组名表示取出的是整个数组的地址。
除去上述两种情况,其他时候数组名均表示数组首元素的地址
2.strlen()计算字符串长度(\0之前字符个数),参数是字符型指针
光说不练假把式,下面👇举代码实例说明(已经提供超级详细解析,大家可以直接复制代码验证)详细分类代码见
https://blog.csdn.net/fjf_666/article/details/127449695
//1.一维数组
int a[]={1,2,3,4};
printf("%d\n",sizeof(a));//16 表示整个数组长度,4*4=16
printf("%d\n",sizeof(a+0));//4/8 a+0既不是sizeof(数组名),也不是&数组名,故a表示首元素地址
printf("%d\n",sizeof(*a));// 4此时a表示首元素地址,*a是首元素
printf("%d\n",sizeof(a+1));// 4/8 a+1表示第二个元素地址
printf("%d\n",sizeof(a[1])); //4
printf("%d\n",sizeof(&a));// 4/8
printf("%d\n",sizeof(*&a));//&a取出整个数组地址,*&a对其进行解引用操作,表示整个数组
printf("%d\n",sizeof(&a[0]));//4/8数组首元素地址
printf("%d\n",sizeof(&a+1));// 4/8表示跳过整个数组后的地址,但还是地址
//2.字符数组
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));//6
printf("%d\n",sizeof(arr+0));//4/8
printf("%d\n",sizeof(*arr));//1表示首元素的大小
printf("%d\n",sizeof(arr[1]));//1表示第二个元素大小
printf("%d\n",sizeof(&arr));//4/8
printf("%d\n",sizeof(&arr+1));//跳过整个数组的地址
printf("%d\n",sizeof(&arr[0]+1));//是第二个元素的地址
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",strlen(arr));//随机arr是首元素地址在,\0位置未知
printf("%d\n",strlen(arr+0));//随机是首元素地址,\0位置未知
printf("%d\n",strlen(*arr));//'err接收'a'97
printf("%d\n",strlen(arr[1]));//err接收'b'的98
printf("%d\n",strlen(&arr));//随机 从首元素开始计算直到遇见\0
printf("%d\n",strlen(&arr+1));//随机 接收跳过一个数组后的地址开始计算
printf("%d\n",strlen(&arr[0]+1));//随机 从第二个元素开始计算直到遇见\0
char arr[]="abcdef";
printf("%d\n",sizeof(arr));// 7
printf("%d\n",sizeof(arr+0)); //4/8不是sizeof(arr),也不是&arr,表示首元素地址
printf("%d\n",sizeof(*arr)); //1不是sizeof(arr),也不是&arr,表示首元素地址arr指首元素
printf("%d\n",sizeof(arr[1]));//1=*(arr+1)不是sizeof(arr),也不是&arr,表示首元素地址arr指首元素,arr+1表示第二个元素
printf("%d\n",sizeof(&arr));//4/8 &arr是整个数组的地址
printf("%d\n",sizeof(&arr+1));//4/8 表示跳过整个数组后的地址
printf("%d\n",sizeof(&arr[0]+1));//4/8第二个元素地址
char arr[]="abcdef"
printf("%d\n",strlen(arr));//6遇到\0停止
printf("%d\n",strlen(arr+0));//6遇到\0停止
printf("%d\n",strlen(*arr));//err'a'接收97,无法识别
printf("%d\n",strlen(arr[1]));//err'b'接收98,无法识别
printf("%d\n",strlen(&arr));//err随机有告警&arr是指整个数组的地址,需存放在数组指针中,char(*p)[7]=&arr,其参数类型为char(*)[7],而strlen的参数类型为const char*,类型不同
printf("%d\n",strlen(&arr+1));//随机
printf("%d\n",strlen(&arr[0]+1));//5指从第二个元素开始计算,遇见\0停止
char*p="abcdef";
printf("%d\n",sizeof(p));//4/8计算指针变量p的大小
printf("%d\n",sizeof(p+1));//4/8得到b的地址
printf("%d\n",sizeof(*p));//1字符串第一个字符'a'
printf("%d\n",sizeof(p[0]));//1p[0]=*(p+0)='a'
printf("%d\n",sizeof(&p));//4/8指针大小
printf("%d\n",sizeof(&p+1));//4/8指针大小
printf("%d\n",sizeof(&p[0]+1));//4/8指针大小
char*p="abcdef";
printf("%d\n",strlen(p));//6遇到\0停止
printf("%d\n",strlen(p+1));//5遇到\0停止
printf("%d\n",strlen(*p));//err接收97('a')
printf("%d\n",strlen(p[0]));//err接收97('a')
printf("%d\n",strlen(&p));//随机p中储存a的地址,地址中/0位置未知
printf("%d\n",strlen(&p+1));//随机p中储存a的地址,地址中/0位置未知
printf("%d\n",strlen(&p[0]+1));//5从b开始计算
//二维数组
int a[3][4]={0,1,2};
printf("%d\n",sizeof(a));// 48,3*4*4=48
printf("%d\n",sizeof(a[0][0]));//4第一行第一个元素
printf("%d\n",sizeof(a[0]));//16 4*4=16a[0]是第一行元素,相当于一维数组的数组名,计算第一行大小
printf("%d\n",sizeof(a[0]+1));//4/8此时a[0]表示第一行首元素,+1表示第一行第二个元素地址
printf("%d\n",sizeof(*(a[0]+1)));//4表示第一行第二个元素
printf("%d\n",sizeof(a+1));//4/8 a是二维数组名,没有sizeof(数组名),也无&数组名故a为首元素地址,二维数组首元素为第一行,a+1表示第二行元素地址
printf("%d\n",sizeof(*(a+1)));//16=sizeof(a[1])计算第二行大小
printf("%d\n",sizeof(&a[0]+1));//4/8&a[0]是第一行,&a[0]+1是第二行地址
printf("%d\n",sizeof(*(&a[0]+1)));//16第二行元素
printf("%d\n",sizeof(*a));//16没有sizeof(a),也没有&a,a为首元素,二维首元素是第一行
printf("%d\n",sizeof(a[3]));//16sizeof不会真实访问第四行,只根据元素类型大小推断