sizeof 和 strlen 在求解数组 字符数组 字符串 二维数组时候的小结

一维数组

 int a[] = {1,2,3,4}; 

 printf("%d\n",sizeof(a));

 printf("%d\n",sizeof(a+0)); 

 printf("%d\n",sizeof(*a)); 

 printf("%d\n",sizeof(a+1));

 printf("%d\n",sizeof(a[1])); 

 printf("%d\n",sizeof(&a));

 printf("%d\n",sizeof(&a+1)); 

 printf("%d\n",sizeof(&a[0])); 

 printf("%d\n",sizeof(&a[0]+1)); 

解释


字符数组

 char arr[] = {'a','b','c','d','e','f'};

 printf("%d\n", sizeof(arr));

 printf("%d\n", sizeof(arr+0)); 

printf("%d\n", sizeof(*arr)); 

printf("%d\n", sizeof(arr[1])); 

printf("%d\n", sizeof(&arr)); 

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)); 

printf("%d\n", strlen(arr+0)); 

printf("%d\n", strlen(*arr)); 

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[] = {'a','b','c','d','e','f'};
1 printf("%d\n", strlen(arr)); 

2 printf("%d\n", strlen(arr+0)); 

 与上图(1)一样  括号中的arr与arr+0  都表示从第一个元素找起 直到\0结束。同一个系统下产生的随机值也与一样。

3printf("%d\n", strlen(*arr)); 


4printf("%d\n", strlen(arr[1])); 

和3 一个道理  会把b的ASCII值98給strlen然后去寻找   报错   类型不兼容  道理和1.2一样。产生的结果也会和1.2一样

5printf("%d\n", strlen(&arr)); 

与1 2 一样

6printf("%d\n", strlen(&arr+1)); 


printf("%d\n", strlen(&arr[0]+1)); 

与1 2 一样   但会比1 2 大小减一   因为在第二个元素开始寻找

字符串:

 char *p = "abcdef";

 printf("%d\n", sizeof(p)); 

 printf("%d\n", sizeof(p+1)); 

 printf("%d\n", sizeof(*p)); 

 printf("%d\n", sizeof(p[0])); 

 printf("%d\n", sizeof(&p)); 

 printf("%d\n", sizeof(&p+1));

 printf("%d\n", sizeof(&p[0]+1)); 
 
 printf("%d\n", strlen(p));

 printf("%d\n", strlen(p+1)); 

 printf("%d\n", strlen(*p));

 printf("%d\n", strlen(p[0])); 

 printf("%d\n", strlen(&p));

 printf("%d\n", strlen(&p+1)); 

 printf("%d\n", strlen(&p[0]+1)); 

解释

char *p = "abcdef";

 printf("%d\n", sizeof(p)); 


 printf("%d\n", sizeof(p+1));

 与第一个道理一样 p+1表示第二个元素b的地址大小 4 

 printf("%d\n", sizeof(*p)); 


 printf("%d\n", sizeof(p[0]));

与第三个一样  首元素a的大小 1 

 printf("%d\n", sizeof(&p)); 

与&arr一个道理 求得的是整个数组的地址大小4

 printf("%d\n", sizeof(&p+1));


 printf("%d\n", sizeof(&p[0]+1)); 

求的是第二个元素的地址大小4
 
 printf("%d\n", strlen(p));

从首元素开始计算字符个数  直到\0结束  (\0不计算在内)

 printf("%d\n", strlen(p+1)); 


 printf("%d\n", strlen(*p));

错误的  把a的ASCII码给了函数 去当作地址寻找

 printf("%d\n", strlen(p[0])); 

同上

 printf("%d\n", strlen(&p));

把指针的地址給strlen去寻找  类似下图

 printf("%d\n", strlen(&p+1)); 


 printf("%d\n", strlen(&p[0]+1));

从第二个元素开始找  得到5

二维数组:

 int a[3][4] = {0}; 
 
 printf("%d\n",sizeof(a));

 printf("%d\n",sizeof(a[0][0]));

 printf("%d\n",sizeof(a[0])); 

 printf("%d\n",sizeof(a[0]+1)); 

 printf("%d\n",sizeof(a+1));

 printf("%d\n",sizeof(&a[0]+1)); 

 printf("%d\n",sizeof(*a)); 

 printf("%d\n",sizeof(a[3])); 


解释

 int a[3][4] = {0}; 
 
 printf("%d\n",sizeof(a));

a表示整个数组12个元素   大小为   12*4=48

 printf("%d\n",sizeof(a[0][0]));

第一行第一列这个元素的大小 4

 printf("%d\n",sizeof(a[0])); 

a[0]表示第行四个元素  4*4=16

 printf("%d\n",sizeof(a[0]+1)); 

a[0]表示第一行  +1  第一行第二个元素 大小为4

 printf("%d\n",sizeof(a+1));

   第二行元素的地址  大小为4  

 printf("%d\n",sizeof(&a[0]+1)); 

第一行 第二个元素的地址  4

 printf("%d\n",sizeof(*a)); 

表示第一行元素  4*=16  (跟一维数组不同)


 printf("%d\n",sizeof(a[3])); 

已经跳出数组但地址空间依旧是4个  大小为4*4=16


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值