指针进阶之疑难杂症 第一节

 

 


以下是本篇文章正文内容,下面案例可供参考

一、两大巨头函数

1.sizeof是什么?

sizeof 在 C 语言中是一个运算符,用于返回变量的字节数(存储字节的数量)。调用 sizeof 时,可以使用变量名或者某种类型的数据(如int),而它会返回以字节为单位的大小。

例如计算一个数组arr[10]的大小  sizeof(arr[0])表示该元素所占字节 而 sizeof(arr)表示这个数组中所元素所占字节  即sizeof(arr)/ sizeof(arr[0])表示这个数组的大小。

2.strlen是什么?

size_t strlen ( const char * str );

返回值是字符串的长度,且是无符号的整型

注意:参数指向的字符串遇到“\0”结束,长度不包含\0"

二、指针中二者的疑难杂症分析例题

1.一维数组

 

//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));       
计算的是a数组所占字节数4*4=16
 
printf("%d\n",sizeof(a+0));    
a表示的a数组首元素的地址a+0还表示地址大小,64位为8,32位为4
 
printf("%d\n",sizeof(*a));     
首元素地址 解引用 找到该元素 1 占四个字节 =4
 
printf("%d\n",sizeof(a+1));       
与sizeof(a+0)相同  4或8
 
printf("%d\n",sizeof(a[1]));       
a[1]表示的是a中第二个元素,int类型占了4个字节
注释:只有&a时才表示整个数组的地址。
 
printf("%d\n",sizeof(&a));   
计算的是整个数组的地址大小 4或8
 
printf("%d\n",sizeof(*&a));   
&a找到a的地址解引用找到所有元素——4*4=16
 
printf("%d\n",sizeof(&a+1));                   计算的是整个数组的地址 跨过了a数组大小的空间的地址大小 =4或8
 
printf("%d\n",sizeof(&a[0])); 
计算的是第一个元素的地址大小  4或8
 
printf("%d\n",sizeof(&a[0]+1)); 
+1表示向后移一个地址 依旧为4或8

2.二维数组

(与一维数组差异不大)注释:二维数组中a[0]表示二维数组首元素,首元素为第一行

a[0]+1  a[0]+1表示的是第一行第一个元素向后移一个 即第一行第二个元素的地址

a+1 指向第二行地址

//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); 
计算的是二维数组元素所占字节 3*4*4=48
 
printf("%d\n",sizeof(a[0][0])); 
计算第一个元素所占字节=4
 
printf("%d\n",sizeof(a[0]));       
见注释  4*4=16
 
printf("%d\n",sizeof(a[0]+1));          
a[0]+1表示的是第一行第一个元素向后移一个 即第一行第二个元素的地址大小  4或8
printf("%d\n",sizeof(*(a[0]+1))); 
a[0]+1表示第1行第二个元素  * 解引用后=4
 
printf("%d\n",sizeof(a+1)); 
第二行地址大小  4或8
 
printf("%d\n",sizeof(*(a+1)));  
第二行解引用找到第二行  4*4=16
 
printf("%d\n",sizeof(&a[0]+1));  
第二行地址大小 4或8
 
printf("%d\n",sizeof(*(&a[0]+1)));   
第二行解引用找到第二行  4*4=16
 
printf("%d\n",sizeof(*a)); 
单独的a表示首元素地址解引用后即为首元素所占字节 4*4=16
 
printf("%d\n",sizeof(a[3]));                  
a[3]跨界访问但是不会报错,因为sizeof 并不会改变计算的值,形式对即可

总结

 数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值