指针和一维数组和二维数组(详细)

一维数组和指针

int a[5] = { 0 };

int(*c)[5] = &a;

a 是一个数组,只用 a 的话,a 就代表数组首元素地址,就是 a == &a[0]。
&a是整个数组的地址(虽然值相同,但是意义不同,+1之后的结果也不同)。

c 是一个数组指针,就是指向数组的指针,所以给 c 赋值 c = &a;
*c自然就等于a,
*c是数组a的首元素地址。
*c+1是数组第二个元素的地址
*(*c+1)等于a[1]。

再定义一个二维指针

int **b;

**b代表一个整型数,*b代表整型数的地址,b代表整型数的地址的地址。

那么问题来了
*c是数组a的首元素地址,*b代表整型数的地址。能把 c 的值赋给 b 吗?

b = c;			//这样可行吗 ???

答案是否定的!
因为 c 是指向数组的指针,b 是指向指针的指针。

b = (int **)c;			//强制转化,指向同一个地址
cout << "b = " << b << endl;
cout << "b+1 = " << b + 1 << endl;
cout << "c+1 = " << c + 1 << endl;

现在 b 和 c 指向同一个内存地址,由前文分析可得,b + 1 和 c + 1 是不同的。
在这里插入图片描述
b + 1 是加了4个字节(一个int )
c + 1 是加了20个字节(5个int)。

二维数组和指针

	int aa[3][3];
	cout << aa << endl;
	cout << aa + 1 << endl;
	cout << aa[1] + 1 << endl;
	cout << &aa[1] + 1 << endl;
	cout << &aa + 1 << endl;
	cout << &aa << endl;

在这里插入图片描述
地址分布如图:
在这里插入图片描述
把二维数组当做一维数组来看,二维数组不过是一维数组里的元素是数组而已。

cout << aa << endl;
cout << aa + 1 << endl;
在一维数组中,数组名表示首元素地址,所以二维数组的数组名代表第一行数组的地址。
aa是第一行数组的地址,数值上等于二维数组的地址、二维数组首元素的地址。
aa + 1 就是第二行数组的地址。(00DDFB64 == 00DDFB58 + 4 * 3).

cout << aa[1] + 1 << endl;
aa[1] 就等于 *(aa + 1) ; 。 aa + 1 是第二行数组的地址。解引用之后 (aa + 1 ) 代表第二行数组首元素的地址。【类比于:y 是数组名,&y 是数组的地址,(&y)== y 。对数组的地址进行解引用得到数组名】。 *(aa + 1)+ 1 就是第二行数组的第二个元素的地址。(00DDFBFB68 == 00DDFB64 + 4)

cout << &aa[1] + 1 << endl;
由上一段,aa[1] 就等于 *(aa + 1) 。 &aa[1] 就等于 aa + 1 就是第二行数组的地址。然后再+ 1, &aa[1] + 1就是第三行数组的地址。(00DDFB70 == 00DDFB64 + 4 * 3)

最后两行,先看 &aa, 再看 &aa + 1
类比于一维数组,int d[5]; d 代表首元素的地址,&d 代表整个数组的地址。
则,aa代表第一行数组的地址,&aa 代表整个数组的地址。
&aa == 00DDFB58

再类比 &aa + 1;
&d + 1 是数组最后一个元素的下一个地址。
则,&aa + 1 是整个二维数组最后一个元素的下一个地址。(00DDFB7C == 00DDFB58 + 4 * 9)

总结:

1. 对指向数组的解引用就是数组名,也就是数组首元素的地址。

2. a[1] == *(a + 1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值