(一)、指针数组
1. 什么是指针数组:
在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
2.指针数组的格式:
数据类型 *首地址[];
3.指针数组的作用:
指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。
4.指针数组与一维数组的关系:
指针数组每个元素都是指针,一维数组的地址可以赋值给指针。然后进行操作.
#include<iostream> using namespace std; int main() { int* p[3]; //定义一个指针数组 int a[] = { 3,6,1,9,10 }; //定义一个整型数组 p[0] = a; //p[0]是一个类型为int* 指向int的指针,a是一个int*,指向int p[1] = a + 1; p[2] = a + 3; cout << (*p[0]) << " " << (*p[1]) << " " << (*p[2]) << endl; //[]优先级比()高,所以()没起到作用 cout << a[0] << " " << a[1] << " " << a[3] << endl; int* q; //普通指针 q = a + 1; cout << *q; }
补充:::::::::::::::::::
如果是 二维数组a[0]+1;代表a[0][1]; 这时候a[0]是行数组名它代表这一行的首地址就是a[0][0],+1就等于加它类型的字节数1x字节数,(+2就是2x字数)结果就是a[0][1];如果是一维的话,更简单;+1就等于加它类型的字节数x1;结果是a[1];
5.指针数组与二维数组的关系
#include<iostream> using namespace std; int main() { int* p[3]; //定义一个指针数组 int a[2][3] = {{3,6,1} ,{12,9,10}}; //定义一个二维整型数组 p[0] = a[0]; //a[0]=&a[0][0] p[1] = a[1]; // a[1]=&a[1][0] cout << a[0][1] << endl; //输出a[0][1] cout << *(a[0] + 1) << endl; //输出a[0][1],(a[0]+1)这样代表地址 cout << *(p[0] + 1) << endl; //输出a[0][1],指针+1代表移动一个数(列) cout << *(p[0] + 2) << endl; //输出a[0][2],指针+1代表移动一个数(列) return 0; }
接下来让我们练习一道题:(二维数组全部元素求和)
#include<iostream> using namespace std; int main() { int sum=0; int* p[3]; //定义一个指针数组 int a[2][3] = {{3,6,1} ,{12,9,10}}; //定义一个二维整型数组 p[0] = a[0]; //a[0]=&a[0][0] p[1] = a[1]; // a[1]=&a[1][0] for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { sum += *(p[i] + j);//或者 *(*(p+i)+j) 或者 p[i][j] } } cout << "求和后得:" << sum << endl; return 0; }
6.指针数组申请动态二维数组
指针数组申请动态二维数组格式:
【方法1基本格式】 int **p; //指针类型是int** 型,指向int*型的指针变量 p=new int*[列] for(int i=0;i<列;i++) { p[i]=new int [列] }
6.实战项目:
代码展示:
1.错误示范:
【指针指向二维数组不能用*p=a[0]】 #include <iostream> #include <iomanip> using namespace std; int main() { int a[2][2] = {1,2,3,4}; int* p; *p = a[0]; for (int i = 0; i < 4; i++) { cout << setw(2) << *(p+i) ; } return 0; }
2.指针数组申请动态二维数组
#include <iostream> using namespace std; int main() { int m, n; cout << "请输入行数为:" << endl; cin >> m; cout << "请输入列数:" << endl; cin >> n; int**p; // p = new int*[n]; for (int i = 0; i < n; i++) { p[i] = new int[n]; //左边行,右边列 } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> p[i][j]; } } cout << "输出为:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout<< p[i][j]<<" "; } } delete[]p; return 0; }
效果展示:
1.错误示范效果展示:
2.申请动态二维数组正确效果
7.小结
7.1指针数组名加1,移动多少字节?
*(p+1):走了一行; * (p+1)+1走了一列
7.2指针数组名相当于什么样的指针?
指针数组名就是元素地址相当于一级指针取地址就是二级指针,故指针数组名相当于二级指针“数据类型 * p” 本身就是一个指针,而它的数据类型是int * 也是一个指针,故称为二级指针。
(二)、数组指针:
1.什么是数组指针
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
2.数组指针的格式:
数据类型(*p)[];
3.数组指针的作用:
数组指针是指向数组地址的指针,其本质为指针;