深入理解C语言数组:地址、大小与边界

数组名与地址大小

数组名

数组名是首元素地址,有两个例外:
1.sizeof(数组名),此处sizeof计算的是整个数组的大小,不是首个元素的大小
2.&数组名,这里的数组名是指整个数组

地址大小

所有地址的大小是4/8个字节,区别在于运行环境是x64/x86

字符数组与字符串

从strlen和sizeof两个方面:

#include<stdio.h>
{int a[]={1,2,3,4,};
printf("%d\n",sizeof(a));
//sizeof(a)中a指向的是整个数组,输出为16
printf("%d\n",sizeof(a+0));
//此处不是单独的sizeof(数组名),此处的a只此处第一个元素的首地址+0,还是指向第一个元素的首地址,输出4/8
printf("%d\n",sizeof(*a));
//*a就是数组第一个元素,即求第一个元素的的地址大小,输出:4/8
printf("%d\n",sizeof(a+1));
//此处不是单独的sizeof(数组名),此处的a只此处第一个元素的首地址+1,指向第二个元素的地址,输出:4/8
printf("%d\n",sizeof(a[1]));
//a[1]指向第二个元素地址大小,输出:4/8
printf("%d\n",sizeof(&a));
//取地址整个元素的地址,输出:4/8
printf("%d\n",sizeof(&a+1));
//指向的是最后一个元素的末尾的地址,输出:4/8
printf("%d\n",sizeof(a[0]+1));
//指向第二个元素的地址,输出4/8
return0;
}

注意:1.在sizeof(a+0)和sizeof(&a)中,首元素的地址和整个数组的地址是相同的,区别在于在其后面±整数时影响了其步长,前者加一跳过数组中的一个元素,后者则是跳过整个素组的长度
在这里插入图片描述

char arr[]={'a','b','c','f','e','f'};
printf("%d\n",sizeof(arr));
//arr代表整个数组,输出:6
printf("%d\n",sizeof(arr+0));
//此处不是单独的sizeof(数组名),arr+0代表的是首元素地址,输出4/8
printf("%d\n",sizeof(*arr));
//解引用首元素,相当于sizeof(a),输出:1
printf("%d\n",sizeof(arr[1]));
//相当于sizeof(b),输出:1
printf("%d\n",sizeof(&arr));
//&arr指向整个数组的地址,输出:4/8
printf("%d\n",sizeof(&arr+1));
/指向最后一个元素末的地址,输出:4/8
printf("%d\n",sizeof(&arr[0]+1));
//指向第二个元素的地址,输出:4/8
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));
 // 输出:err,第一个元素 'a' 的 ASCII 值是97,当97作为地址输入,属于非法访问
printf("%d\n",strlen(arr[1])); 
// 输出:err,第一个元素 'b' 的 ASCII 值是98,当98作为地址输入,属于非法访问
printf("%d\n",strlen(&arr));
// 输出:随机值,数组中无‘\0’
printf("%d\n",strlen(&arr+1)); 
// 输出:随机值,数组中无‘\0’
printf("%d\n",strlen(&arr[0]+1)); 
// 输出:随机值,数组中无‘\0’
char arr[]="abcdef";//实际:a b c d e f \0
printf("%d\n",strlen(arr)); 
// 输出:6,从第一个元素到最后一个
printf("%d\n",strlen(arr+0));
// 输出:6,从第一个元素到最后一个
printf("%d\n",strlen(*arr));
 // 输出:err,第一个元素 'a' 的 ASCII 值是97,当97作为地址输入,属于非法访问
printf("%d\n",strlen(arr[1])); 
// 输出:err,第一个元素 'b' 的 ASCII 值是98,当98作为地址输入,属于非法访问
printf("%d\n",strlen(&arr));
// 输出:6,从第一个元素到最后一个
printf("%d\n",strlen(&arr+1)); 
// 输出:随机值,数组中无‘\0’
printf("%d\n",strlen(&arr[0]+1)); 
// 输出:5,从第二个元素到最后一个
char arr[]="abcdef";//实际:a b c d e f \0
printf("%d\n",sizeof(arr)); 
// 输出:7,从第一个元素到\n
printf("%d\n",sizeof(arr+0));
// 输出:4/8,首元素地址
printf("%d\n",sizeof(*arr));
 // 输出:1,相当于sizeof(a)
printf("%d\n",sizeof(arr[1])); 
 // 输出:1,相当于sizeof(b)
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";//将a的地址放入了p中

printf("%d\n",sizeof(p)); 
// 输出:4/8,p指向a
printf("%d\n",sizeof(p+1));
// 输出:4/8,p+1指向b
printf("%d\n",sizeof(*p));
 // 输出:1,*p指向a
printf("%d\n",sizeof(p[0])); 
// 输出:1,指向a,等价于*p
printf("%d\n",sizeof(&p));
// 输出:4/8,相当于求p的地址(char**p)
printf("%d\n",sizeof(&p+1)); 
// 输出:4/8,指向char**p地址末
printf("%d\n",sizeof(&p[0]+1)); 
// 输出:4/8,指向b的地址

思考题:`

char* p=“abcdef”;//将a的地址放入了p中

printf(“%d\n”,strlen§);
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));

上面的输出各是多少?欢迎评论!!!

  • 22
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值