int a; int *p; //注意:定义指针时的*属于声明,并不是取值符 p = &a; //&为取地址符,p存放a的地址 所以 *p 等价于 a; //*为取值符
指针类型
数组指针
指向数组的指针,存放数组的地址
注意:数组名是首地址,&数组名才是数组地址
指向数组的类型 (*指针变量)[数组中元素个数]
如:
1 2 3 4 5 6
int a[5] = { 1, 2, 3, 4, 5 }; int (*p)[5] = &a; for (int i = 0; i < 5; i++) { cout << (*p)[i] << " "; } 输出结果:12345
函数指针
指向函数的指针,存放函数的地址
注意:函数名就是函数地址
指向函数的类型 (*指针变量)(函数的参数列表)
如:
1 2 3 4 5 6 7 8 9
intmax(int x, int y) { return x > y ? x : y; } intmain() { int (*p)(int, int) = max; cout << (*p)(3, 5); //函数指针的调用,*p即运用取值找到该函数 return0; } 输出结果:5
指针操作
1 2 3 4 5 6
int *p; p++; //指针p指向下一个 p--; //指针p指向上一个 int (*p)[5]= &arr; cout << *(p+1); //指向地址(下标)为1的元素,即arr[1]
动态数组
极其节省空间,动态分配数组空间
动态数组的使用有两种方式:1、指针(如*(p+1)) 2、数组下标(如a[1])
指针可以当作数组名,如一级指针p可以当一维数组名,二级指针pp可以当二维数组名
动态一维数组
1 2 3 4 5 6 7 8 9 10 11 12 13
intmain() { int n; cin >> n; int *p = new int[n]; //此处是将p当作数组名看待,申请一个int型大小为n的空间存放int型的指针p for (int i = 1; i <= n; i++) { cin >> *(p+i); } for (int i = 1; i <= n; i++) { cout << *(p+i) << " "; } delete[] p; return0; }
输入:5
1 2 3 4 5
输出:1 2 3 4 5
动态二维数组
运用多级指针实现,主要思路就是把二维数组当作多个一维数组来看待。
1 2 3 4 5 6
int r = 5; //用于表示行数 int c = 5; //用于表示列数 int **arr = new int*[r]; //开辟一块内存来存放每一行的地址 for (int i = 0; i < row; i++) //分别为每一行开辟内存 arr[i] = new int[c]; //这是一个r行c列的动态二维数组。