指针与数组

指针与数组的关系颇为复杂,让人不好理解,同时又难于记忆,但是掌握这些要点对于编程有极大的帮助,能够让开发者更加灵活自如的进行切换,博文将用最为通俗易懂的方式来讲解二者之间的关系。

例子1:

#include <iostream>
using namespace std;
int main(){
	int a[12] = { 0 };
	cout << &a[0] << endl;
	cout << a << endl;
	cout << &a << endl;
	cout << &a + 1 << endl;
}
对于上面的代码,经过运行,前三个cout语句的运行结果是一样的,&a[0]和a的打印结果一致,这个比较好理解,因为数组名就代表数组首地址,而对首元素取地址&a[0]自然也是数组的首地址,但是&a又算什么呢。对地址取地址理论上应该是一个二级指针,打印结果应该是差异的,为什么会呈现出这样的结果。其实数组名代表首元素地址的说法并不完全正确,有时候数组名可以代表整个数组,既然数组名可以代表整个数组,对数组名取地址操作的话必然是首个元素的地址,因为数组是用首元素地址来表针的。所以前面三个cout的打印结果一致。

    &a+1的值与&a的值相差了12*4个字节单位,可以说明,在这里数组名代表了整个数组。


例子2:

#include <iostream>
using namespace std;
int main(){
	int m[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
	cout << m << endl;
	cout << &m << endl;
	cout << m[0] << endl;
	cout << *m << endl;
	cout << &m + 1 << endl;
}
对于上面的代码,同样前面四个cout的打印结果一致,在&m和*m的情况下,数组名同样代表了整个数组,m代表了整个数组,*m表示取出数组中的元素,而整个数组使用首元素地址来表征的,所以*m和&m打印结果一致。而&m+1自然而然向前跳跃了12*4个字节单位。


例子3:

对于一个一维数组int a[12];来说,a是一个地址,它是一个int *类型的,做这样的操作int* p = a;是没有问题的。那对于一个二维数组int m[3][4]来说,m会不会是一个int**类型的。其实做int ** a = m,这样的操作必然会出错,出错的情况是类型不匹配。说明二维数组名并不是int**类型的。

#include <iostream>
using namespace std;
int main(){
	int m[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
	int(*q)[4] = m;
	cout << m << endl;
	cout << q << endl;
	cout << *q << endl;
}
从上面的代码可以看出,二维数组名是一个int(*)[n]类型的,n表示二维数组的列数,通过这种方式,可以轻松把一个一维数组转化成二维数组来使用,例如

#include <iostream>
using namespace std;
int main(){
	int a[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	int(*p)[4] = (int(*)[4])a;
	for (int i = 0; i < 3; i++){
		for (int j = 0; j < 4; j++){
			cout << p[i][j] << "  ";
		}
		cout << endl;
	}
}
想象一下二维数组int a[3][4],a[0]是一个什么类型的,a[0]表示的是一个一维数组,则必然是int*类型的。







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值