变量指针、常量指针、常指针、指针数组、数组指针、指针函数、函数指针等…
以及最烦的…指针的指针、指针的指针的指针、……
最简单的指针:变量指针.
比如:
1 2 |
int a; int* A = &a; |
这是刚入门的时候老师会教的指针…是最基本的一种.
在这里不详细讲述,我的思路就一个:指针是一种数据类型,存放的值是地址.
常量指针:指向的是一个常量(存储在静态存储区)
1 |
char *A = "abc"; |
接下来:常指针.这是在C++里面才会有的知识.
主要还是和const有关… const 修饰指针有三种情况:
- const int* A; 或者 int const * A; //const修饰指向的对象,指向的对象可变,但指向的对象的值不可变.
- int* const A; //const 修饰 指针A ,指向的对象不可变,指向的对象的值可变.
- const int* const A; //指针A指向的对象和那个对象的值,都不可变.
简单记忆方法:const 修饰左边的东西,如果左边没有东西则修饰右边的东西…
情况1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include<iostream> using namespace std; int main() { int a = 3; int b = 4; const int* A = &a; cout << *A << endl; A = &b;//指针A指向的对象可变 cout << *A << endl; //指向的对象的值不可变 //*A = 4;//报错:[Error] assignment of read-only location '* A' cout << *A << endl; } |
情况2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include<iostream> using namespace std; int main() { int a = 3; int b = 4; int* const A = &a; cout << *A << endl; *A += 1;//指向的对象的值可变 cout << *A << endl; //指向的对象不可变 //A = &b;//[Error] assignment of read-only variable 'A' cout << *A << endl; } |
情况3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include<iostream> using namespace std; int main() { int a = 3; int b = 4; const int* const A = &a; cout << *A << endl; //指向的对象和指向的对象的值都不可变 //*A += 1;//[Error] assignment of read-only location '*(const int*)A' cout << *A << endl; //A = &b;//[Error] assignment of read-only variable 'A' cout << *A << endl; } |
指针数组:即指针的数组.
1 2 |
int *p[n]; //p为指针数组,由n个指向整型的指针元素组成。 int **q[n]; //q为指针数组,由n个指向整型的二级指针组成。 |
三级四级不再举例…
数组指针:即一个数组的指针
1 2 |
int* A; //A既可以看做 指向一维数组的指针,也可以看做一个指向整型元素的指针. int (*p)[n]; //p为 指向整型二维数组的指针,二维数组的列数为n |
//带括号的是数组的指针…
指针函数:返回值为指针的函数
1 |
int *p(void) //p为返回指针值的函数,该指针指向整型量 |
函数指针:函数地址的指针
1 |
int (*p)() //p为指向函数的指针,该函数返回整型量 |
//带括号的是函数的指针
指向指针的指针:
1 |
int **p; //p为一个指向另一指针的指针变量,该指针指向一个整型量。 |
指针的指针的指针:(便于理解称为三级指针…)
1 |
int ***p; //三级指针,它存放的是一个int型二级指针的地址. |
【C/C++】各种指针简单解析.