指针与数组
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*类型的。
以上是关于指针与数组的主要内容,如果未能解决你的问题,请参考以下文章