用指针访问数组元素
数组是一组连续存储的同类型数据,可以通过指针的算术运算,使指针依次指向数组的各个元素,进而可以遍历数组。使用指针来访问数组元素时,需要将数组的首地址赋值给指针变量,形式为: int *p,a[10];p=a(或者p=&a[0])。
经过上述定义及赋值后*pa就是a[0],*(pa+1)就是a[1],... ,*(pa+i)就是a[i]。a[i], *(pa+i), *(a+i), pa[i]都是等效的。
案例:设有一个int型数组a,有10个元素。用三种方法输出各元素:使用数组名和下标;使用数组名和指针运算;使用指针变量
代码1:
#include<iostream>
using namespace std;
int main() {
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
代码2:
#include<iostream>
using namespace std;
int main() {
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 0; i < 10; i++)
cout << *(a + i) << " ";
cout << endl;
return 0;
}
代码3:
#include<iostream>
using namespace std;
int main() {
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int *p = a; p < (a + 10); p++)
cout << *p << " ";
cout << endl;
return 0;
}
指针数组:顾名思义,数组元素是指针的数组就叫做指针数组。
我们可以用二维数组来存放矩阵,也可以用一维指针数组来存放矩阵,见下面案例。
代码:
#include<iostream>
using namespace std;
int main() {
int line1[] = { 1, 0, 0 }; //矩阵的第一行
int line2[] = { 0, 1, 0 }; //矩阵的第二行
int line3[] = { 0, 0, 1 }; //矩阵的第三行
//定义整型指针数组并初始化
int *pLine[3] = { line1, line2, line3 };
cout << "Matrix test:" << endl;
//输出矩阵
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << pLine[i][j] << " ";
cout << endl;
}
return 0;
}
这里我们先定义并初始化了三个一维数组,每一个一维数组用来存放矩阵的一行。然后我们用一个指针数组来存放这三个一维数组的首地址,并且在定义的时候就初始化。这样这个指针数组的名字就可以当作地址用来访问这三个一维数组了。相比于使用二维数组来存放矩阵,使用指针数组和一维数组来存放矩阵的区别在于:二维数组在内存空间中是连续存放的,而使用指针数组来间接存放矩阵的这种方法在内存空间上可能是不连续的。