C语言 数组中地址加1 理解与举例

文章简介

数组中 地址+n 所代表的的意义

一维数组

初始化数组

A[3] = {1,2,3};

遍历数组

sizeof(int) = 4,即一个int大小为4个字节,可见每个元素间隔4个字节

代码指向的值 即:*(代码)
&A[0]0X0061FF101
&A[1]0X0061FF142
&A[2]0X0061FF183
&A[3]0X0061FF1C乱码
开始操作
代码指向的值即:*(代码)解释
&A+10X0061FF1C乱码+1加的是一个A(即+3个int)的大小 相当于是A[3](越界)
&A[0] +10X0061FF142+1加的是一个A[0](即+1个int)的大小 相当于是A[1]
&A[0] +20X0061FF183+2加的是两个A[0](即+2个int)的大小 相当于是A[2]

二维数组

初始化数组

int A[2][3] = {{1,2,3},{4,5,6}};

遍历数组
代码指向的值即:*(代码)
&A[0][0]0X0061FEFC1
&A[0][1]0X0061FF002
&A[0][2]0X0061FF043
&A[1][0]0X0061FF084
&A[1][1]0X0061FF0C5
&A[1][2]0X0061FF106
开始操作
代码指向的值即:*(代码)解释相当于
&A+10X0061FF1C乱码+1加的是一个A的大小(即+1*(2*3)个int)A[3][0](越界)
&A[0] +10X0061FF080X61FF08+1加的是一个A[0]的大小(即+1*3个int)A[1]的值(一个地址)
*(&A[0] +1)0X0061FF084对上面取值相当于是A[1][0]
&A[0][0] +10X0061FF002+1加的是一个A[0][0]的大小(即+1*1个int)A[0][1]

总结

数组地址加n要看主体是什么:

  • &A+n 加的是n个A的大小
  • &A[0] + n 加的是n个A[0]的大小
  • &A[0][0] + n 加的是n个A[0][0]的大小

需要注意的是A[0]、A[0][0]在不同维度数组中代表的意义不同,例如A[0]:

  • 在一维数组中代表第一个元素,即一个数值
  • 在二位数组中代表第一个元素,即一个一维数组,即一个地址,需要再加*取值

应用举例

遍历一维数组

初始化数组:int A[3] = {1,2,3};//记住:3个元素

  • 方式1:正常遍历
for(int i = 0;i < 3;i++)
   	printf("%d\t",A[i]);	
  • 方式2:使用指针
for(int *p = &A[0];p < &A[0]+3;p++)
	printf("%d\t",*p);

其中for中的条件可以换成以下:

for范围等价于
p <= &A[2]基础式
p <= &A[0] + 2p <= &A[2]
p < &A[3]基础式
p < &A[0] + 3p < &A[3]
p < *(&A+1)p < &A[3]

遍历二维数组

初始化:int A[2][3] = {{1,2,3},{4,5,6}};//记住:行数是2,列数是3

  • 方式1:正常遍历
for(int i = 0;i < 2;i++)
   	for(int j = 0;j < 3;j++)
   		printf("%d\t",A[i][j]);
  • 方式2:使用指针
for(int *p = &A[0][0];p < &A[0][0] + 2*3;p++)
	printf("%d\t",*p);

其中for中的条件可以换成以下:

for范围等价于
p <= &A[1][2]基础式
p <= &A[0][0] + 5p <= &A[1][2]
p < &A[2][0]基础式
p < &A[0][0] + 6p < &A[2][0]
p < *(&A[0] + 2)p < &A[2][0]
p < **(&A+1)p < &A[2][0]
  • 27
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值