指针与数组

Posted uestclr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针与数组相关的知识,希望对你有一定的参考价值。

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

例子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*类型的。







以上是关于指针与数组的主要内容,如果未能解决你的问题,请参考以下文章

指针数组与数组指针详解

指针数组与数组指针

数组指针与指针数组

C语言指针指向一维数组与二维数组?

指针与数组

指针与数组