不同情况下数组名的意义(包含练习)

一.数组名的意义

1. sizeof(数组名) ,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩。
整个数组一共有5个元素,每个元素的数据类型位int,大小是4个字节,所以整个数组的大小就是
5*4==20个字节
2. &数组 名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址。
 

 

 可以看到,取地址arr输出的地址就是数组arr的地址,但是为了防止取到的是arr数组首元素的地址,我们来验证一下。

 

 在&arr的基础上加1,输出结果增加了20,说明+1跳过了整个数组,也就是取到的地址是整个数组的地址。

3. 除此之外所有的数组名 都表⽰ ⾸元素的地址

 

 二.练习

2.1.前提准备

需要了解sizeofstrlen的区别

sizeof:

1. sizeof是操作符
2. sizeof计算操作数所占内存的
⼤⼩,单位是字节
3. 不关注内存中存放什么数据
strlen:
1. strlen是库函数,使⽤需要包含头⽂件 string.h
2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的个数
3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界。

2.2.练习1

大家先自己做一下题再看我的解释,便于更好理解

第一题:sizeof(a),a直接放在sizeof中,表示整个数组,整个数组的大小为4*4==16,输出16。

第二题:a没有直接放在sizeof中,a表示数组首元素的地址,a+0,也表示首元素的地址。地址的大小是4/8个字节,输出4/8。

第三题:a表示数组首元素地址,*a读取第一个元素,元素的类型是int,大小为4个字节,输出4。

第四题:a表示首元素地址,a+1表示第二个元素地址,地址的大小是4/8个字节,输出4/8。

第五题:a[1]表示数组第二个元素,与第三题同理,输出4。

第六题:&a表示整个数组的地址,是地址,大小就是4/8个字节,不会因为是数组就增大,输出4/8

第七题:*和&相互抵消,等价于sizeof(a),与第一题同理,输出16

第八题:取整个数组的地址再加1,还是一个地址,输出4/8。

让我们看一下输出的结果(我用的是32位环境,地址输出的值为8,方便与int类型区分)

2.3练习2

 第一题arr表示数组首元素地址,从首元素开始,到\0结束,输出6

第二题:arr+0也表示首元素地址,与第一题同理,输出6

第三题:*arr表示读取数组首元素,将首元素a的ASCLL码值作为地址,这是非法访问,程序出错

第四题:将数组第二个元素的ASCLL码值作为地址,这是非法访问,程序出错 

第五题:&arr表示整个数组的地址,整个数组的地址与第一个元素的地址在数值上是相同的,从首元素开始,到\0结束,输出6

第六题:&arr+1跳过一整个数组,\0的位置不确定,所以输出的是一个未知数

第七题:先取首元素的地址再+1,表示数组第二个元素的地址,从第二个元素开始,到\0结束,输出5

 (结果中我注释掉了会使程序出错的代码,以确保程序正常运行)

 

 

 

 

 

 

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值