指针与数组

来源:互联网 发布:nature数据库检索方法 编辑:程序博客网 时间:2024/06/05 18:12

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

例子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
原创粉丝点击