C语言sizeof和strlen指针数组超级详细刷题训练

前言:许多初学者学习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不会真实访问第四行,只根据元素类型大小推断
        

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河清风悠

你的鼓励就是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值