赞
踩
指针的运算本身就是适合对连续的数据进行处理,而数组正好满足这一要求。所以这一节研究如何使用指针访问数组元素。
首先我们举个例子
int a[10],*p;//定义一个数组和一个指针变量p
p=a;//或者p=&a[0];这两句话的意思都是将数组a的首地址赋值给p
*p就是a[0],是寻址运算符,就是找到p变量中保存的地址里面的内容,即数组a的第一个元素。
同理(p+i)就是找到对应数组中的第i个元素a[i]。
与此同时 *(a+i)和p[i]也都代表相同的含义。
总结一下便是 *(指针+i) = *(数组名+i) = 数组名[i] = 指针变量名[i]
数组名a是数组的首地址,是一个常量,所以不能进行自加自减运算。
数组的每个元素都是指针变量,这个数组就是指针数组。
语法形式
数据类型 *数组名[下标表达式];
下标表达式指出数组元素的个数,数据类型表示指针的类型,数组名是指针数组的名称也是数组的首地址。
例例用指针数组输出单位矩阵
#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 }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) cout << pline[i][j] << " "; cout << endl; } return 0; }
将三个一维数组的数组名作为指针数组的元素,完成了指针数组的初始化,每个元素分别指向矩阵的一行。
pline[i][j]并不是二维数组而是一维指针数组,前面的pline[i]是指针名,后面的[j]就是对应的元素。(具体看上面的等价方式)。在内存中的存储方式也是不相同的二维数组的元素在内存中是连续的一行接一行,而指针数组在内存中是每行的元素是连续的,但是行与行之间没有关系。
虽然二维数组和指针数组存在本质的差异,但是还是可以通过指针数组对二维数组进行访问。
例 二维数组举例
#include <iostream>
using namespace std;
int main() {
int array2[3][3]= { { 11, 12, 13 }, { 21, 22, 23 }, { 31, 32, 33 } };
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++)
cout << *(*(array2 + i) + j) << " "; //逐个输出二维数组第i行元素值
cout << endl;
}
return 0;
}
通过数组元素的地址可以输出二维数组元素,使用*(*(arry2+i)+j)
这就是arry2数组的第i行第j列元素,对应下标是arry2[i][j].
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。