C指针sizeof()、strlen()练习题详解

总结:

1.sizeof(数组名):这里的数组名表示整个数组,计算的是整个数组的大小

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

3.除此之外所有的数组名均表示首元素地址


//一维数组

int a[] = {1,2,3,4};        
printf("%d\n",sizeof(a));// 16,sizeof(a)计算的是整个数组的大小
printf("%d\n",sizeof(a+0));//4/8,计算的是数组中首元素的大小
printf("%d\n",sizeof(*a));// 4,*a=a[0],计算数组中第一个元素的大小
printf("%d\n",sizeof(a+1));//4/8,a是数组首元素的地址,a+1是第二个元素的地址,也是计算地址的大小,32位平台下,地址大小为4,64位平台下地址为8
printf("%d\n",sizeof(a[1]));//4,计算数组中第二个元素的大小
printf("%d\n",sizeof(&a));//4/8,&a:取出整个数组的地址,仍是计算数组的大小
printf("%d\n",sizeof(*&a));//16,&a取出整个数组地址,再解引用得到整个数组,整个数组大小为16;或者*与&相互抵消,直接计算sizeof(a)
printf("%d\n",sizeof(&a+1));//4/8,&a+1为数组a地址之后加一的地址,仍为地址
printf("%d\n",sizeof(&a[0]));//4/8,取出第一个元素的地址,仍为地址
printf("%d\n",sizeof(&a[0]+1));//4/8,第一个元素地址+1得到第二个元素地址,仍为地址

//字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6,sizeof(arr)计算整个数组的大小
printf("%d\n", sizeof(arr+0));//4/8,计算的是首元素地址的大小
printf("%d\n", sizeof(*arr));//1,取出首元素地址的数据,*arr=*(arr+0)=arr[0]
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8,&arr取出整个数组的地址,仍是地址
printf("%d\n", sizeof(&arr+1));//4/8,&arr取出整个数组的地址,再指向下一个地址,仍是地址
printf("%d\n", sizeof(&arr[0]+1));//4/8,取出第一个元素的地址,再指向下一个地址,即第二个元素的地址,仍是地址

printf("%d\n", strlen(arr)); //随机,数组中没有 \0,知道随机获得\0才会停止
printf("%d\n", strlen(arr+0));//随机
printf("%d\n", strlen(*arr));//err,*arr是首元素‘a’,对应ascii97,不是地址
printf("%d\n", strlen(arr[1]));//err,不是地址
printf("%d\n", strlen(&arr));//随机,取出整个数组地址
printf("%d\n", strlen(&arr+1));//随机
printf("%d\n", strlen(&arr[0]+1));//随机,取出的是第二个地址

char arr[] = "abcdef"; // "abcdef\0"
printf("%d\n", sizeof(arr));//7,计算整个字符串的大小,包括\0
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"; // "abcdef\0"
printf("%d\n", strlen(arr));//6,有 \0,计算字符串的长度
printf("%d\n", strlen(arr+0));//6
printf("%d\n", strlen(*arr));//err,首元素‘a’不是地址
printf("%d\n", strlen(arr[1]));//err,arr[1] 不是地址
printf("%d\n", strlen(&arr));//6,&arr取出整个元素的地址,仍从首元素地址开始执行
printf("%d\n", strlen(&arr+1));//随机,整个元素的地址再指向下个地址,不确定 \0的存在
printf("%d\n", strlen(&arr[0]+1));//5,取出第二个元素的地址,从第二个元素开始执行

char *p = "abcdef";//p为字符型指针变量,里面存的是'a'的地址,参考arr为首元素地址
printf("%d\n", sizeof(p));//4/8,首元素地址的大小
printf("%d\n", sizeof(p+1));//4/8,第二个元素地址大小
printf("%d\n", sizeof(*p));//1,计算*p第一个元素大小
printf("%d\n", sizeof(p[0]));//1,p[0]=*(p+0),计算第一个元素大小
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
printf("%d\n", strlen(p+1));//5,从第二个元素开始执行
printf("%d\n", strlen(*p));//err,*p是'a',不是地址
printf("%d\n", strlen(p[0]));//err,不是地址
printf("%d\n", strlen(&p));//随机,'a'地址的地址
printf("%d\n", strlen(&p+1));//随机
printf("%d\n", strlen(&p[0]+1));//5,第二个元素的地址开始执行

//二维数组

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,a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组,sizeof(a[0])计算的就是第一行的大小
printf("%d\n",sizeof(a[0]+1));//]4/8,取出0行1列的地址
printf("%d\n",sizeof(*(a[0]+1)));//4,取出0行1列的元素<=>a[0][1]
printf("%d\n",sizeof(a+1));//4/8,a是第一行数组的地址,计算的是第二行数组的地址大小
printf("%d\n",sizeof(*(a+1)));//16,计算的是第二行数组大小
printf("%d\n",sizeof(&a[0]+1));//4/8,计算第二行数组地址的大小
printf("%d\n",sizeof(*(&a[0]+1)));//16,计算第二行数组大小
printf("%d\n",sizeof(*a));//16,*a,取出第一行数组,计算第一行数组大小
printf("%d\n",sizeof(a[3])); //16,sizeof()不会对括号中进行运算,
printf("%d\n",sizeof(a[-1]));//16

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值