指针和数组在strlen和sizeof中的效果详解+例题详解【以多个题目进行比较去体验】

指针和数组在strlen和sizeof中的效果

一、strlen - 库函数

返回类型是size_t

形参类型 const char* string


1. 求字符串长度

char arr[] = "abcdef";
int sz = strlen(arr);

2. 关于指针、数组名

//字符数组
char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", strlen(arr));//随机值
//随机值,没有'\0'
printf("%d\n", strlen(arr+0));//随机值
//首元素地址往后打印,没有'\0'
printf("%d\n", strlen(*arr));//错误
//strlen以为传进来'a'= a的ascii码值 97 这个位置的地址
//实际上是个野指针
printf("%d\n", strlen(arr[1]));//同上
printf("%d\n", strlen(&arr));//随机值
//把首元素地址传进去
printf("%d\n", strlen(&arr+1));//随机值
//从跳过这个数组开始数
printf("%d\n", strlen(&arr[0]+1));//随机值
//从第二个元素开始数

char arr[] = "abcdef";

printf("%d\n", strlen(arr));//6
//计算数组元素个数
printf("%d\n", strlen(arr+0));//6
//首元素地址
printf("%d\n", strlen(*arr));//错误
//拿到元素a - 97  野指针
printf("%d\n", strlen(arr[1]));//错误
//同上
printf("%d\n", strlen(&arr));//6
//整个数组的地址,类型不匹配,但还是拿到a的地址
printf("%d\n", strlen(&arr+1));//随机值
//跳过整个数组的地址传进去
printf("%d\n", strlen(&arr[0]+1));//5
//第二个元素地址

//指针
char *p = "abcdef";

printf("%d\n", strlen(p));//6
//a的地址传进去
printf("%d\n", strlen(p+1));//5
//b的地址传进去
printf("%d\n", strlen(*p));//错误
//a - 97
printf("%d\n", strlen(p[0]));//错误
//同上
printf("%d\n", strlen(&p));// 随机值
//不知道指针变量的地址,后面不知道什么时候到'\0'
printf("%d\n", strlen(&p+1));//随机值
//同上
printf("%d\n", strlen(&p[0]+1));//5
//第二个元素的地址

二、sizeof - 操作符 单位字节

求变量所占空间大小


1. 求一个整型数组有几个元素

int a[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
//整个数组所占空间大小/每个元素所占空间大小=整型数组的元素个数

2. 关于指针、数组名

//一维数组

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));// 16
//数组名单独放在sizeof中,a表示整个数组的地址,计算整个数组的大小
printf("%d\n",sizeof(a+0));//  4/8
//不是第一种情况,a是首元素地址,计算首元素地址大小4/8
printf("%d\n",sizeof(*a));// 4
//这里a首元素地址,*a是首元素,元素是整型
printf("%d\n",sizeof(a+1));// 4/8
//第二个元素的地址大小
printf("%d\n",sizeof(a[1]));// 4
//第二个元素所占内存大小
printf("%d\n",sizeof(&a));// 4/8
//&a取出的是整个数组的地址,地址所占大小就是 4/8
printf("%d\n",sizeof(*&a));// 16
//取出整个数组,计算整个数组的大小
printf("%d\n",sizeof(&a+1));// 4/8
//数组地址+1,跳到数组最后,还是地址
printf("%d\n",sizeof(&a[0]));// 4/8
//第一个元素地址
printf("%d\n",sizeof(&a[0]+1));// 4/8
//第二个元素地址


//字符数组

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));// 4/8
//整个数组之后的地址大小
printf("%d\n", sizeof(&arr[0]+1));// 4/8
//第二个元素地址

char arr[] = "abcdef";

printf("%d\n", sizeof(arr));//7
//数组名单独放在sizeof内部表示整个数组
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));//4/8
//跳过整个数组的地址
printf("%d\n", sizeof(&arr[0]+1));//4/8
//第二个元素的地址

//指针
char *p = "abcdef";

printf("%d\n", sizeof(p));// 4/8
//指针大小
printf("%d\n", sizeof(p+1));// 4/8
//第二个元素地址
printf("%d\n", sizeof(*p));//1
//第一个元素
printf("%d\n", sizeof(p[0]));//1
//首元素
printf("%d\n", sizeof(&p));//4/8
//指针的地址
printf("%d\n", sizeof(&p+1));//4/8
//指针的地址+1
printf("%d\n", sizeof(&p[0]+1));//4/8
//第二个元素地址


//二维数组
int a[3][4] = {0};

printf("%d\n",sizeof(a));//48
//整个数组
printf("%d\n",sizeof(a[0][0]));//4
//首元素
printf("%d\n",sizeof(a[0]));//16
//第一行数组名,表示第一行数组
printf("%d\n",sizeof(a[0]+1));//4/8
//a[0]第一行首元素地址,所以是第一行第二个元素地址
printf("%d\n",sizeof(*(a[0]+1)));//4
//第一行第二个元素
printf("%d\n",sizeof(a+1));//4/8
//二维数组的数组名,代表第一行数组的地址,a+1为第二行地址
printf("%d\n",sizeof(*(a+1)));//16
//第二行地址a[1],相当于第二行数组的数组名
printf("%d\n",sizeof(&a[0]+1));// 4/8
//第二行数组地址
printf("%d\n",sizeof(*(&a[0]+1)));//16
//第二行数组数组名
printf("%d\n",sizeof(*a));//4
//第一行首元素
printf("%d\n",sizeof(a[3]));//16
//第四行数组名,因为sizeof内部不参与运算,不会访问该空间
//只是去看了一下第四行的类型


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凛音Rinne

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

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

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

打赏作者

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

抵扣说明:

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

余额充值