话不多说直接上干货!
目录
1.什么是指针?
这里引入一个内容,C语言中变量的定义过程
int a = 10;
这里的'a',在编译器编译后会在计算机内部开辟一个空间以'a'命名,然后再把'10'放入名为'a'的这个空间。总的来说就是int类型变量'a'存放的是一个值(非地址值)。
int* p = &a;
这里的,同上面一样,在编译器编译后会在计算机内部开辟一个空间以'p'命名,然后再把'&a'放入名为'p'的这个空间。总的来说就是int类型指针变量'p'存放的是一个值(地址值)不同的是这里存放的是一个地址罢了。
当像int* p = &a;这样定义过后指针'p'的功能就是指向'a'的地址,即就是可以通过p来访问到'a'的值,但是指针需要用'*'解引用,解引用就是通过符号'*'访问到所指向的空间,如printf("%d\n",*p);这时候打印结果就是10.
下面的图可以用来辅助理解一下:


更多例子来理解:
int a = 23;
int* p = &a;
在上述代码段中进行如下操作
1.用作左值(左值即为可变的量)
(1)*p=23 //可以作为左值,当p指向a时,*p放到等号左边代表a这块空间,当*p放到等号右边代表a这块空间的值。
(2)&a=23 //错误,&a不可以作为左值,因为他不能表示一块特定的空间,&a得到的结果是a的地址,但并不代表a这块空间,要想使用这块空间,必须进行*引用,*&a=23正确。&a可以作为右值,代表是a的地址这个数值。
(3)*p+1 //不可以作为左值,因为*优先级高于+,所以*cp先结合,再加1,即相当于23+1,是一个值不代表一块空间。
(4)*(p+1) //可以作为左值,p+1先结合,指向a的下一块空间,再对这块空间进行*引用,放在等号左边就代表这块空间。
(5)++p //不可以作为左值,因为++p只是将p里面的内容加一,并没有进行*引用
(6)p++ //不可以作为左值
(7)*p++ //可以作为左值,(因为++优先级高于*)先对p指向的地址加一。再解引用,也就是让cp指向a的下一块空间再解引用,相当于*(p+1)
(8)++*p //不可以作为左值,*p代表p所指向的内容,再让其加一,相当于23+1
注意:C中++p和--p都不能做左值,C++中++p可以作为左值。
( !)高级指针
二级指针概念:
回顾:什么是指针???存放地址的变量就叫做指针,所以二级指针就是存放一级指针地址的指针变量。

同样的要想通过p2访问到a的值也是需要解引用的,不过这里是二级即就是用两次嘛.
*p2 = &p1;一次解引用访问到p1的地址
**p2 = 13;二次解引用=>第一次解引用访问到p1的地址,第二次解引用通过p1的地址解引用访问到a.

2.常量指针和指针常量
(1)常量指针:int p = &13;
指向一个常量
(天呐!用个常量还上指针,是该吃吃药打两针了哈!)
(2)指针常量:* (int *)200 = 13;
3.const修饰指针
const 修饰一级指针,修饰二级指针(const修饰的变量,还是一个变量,只不过是只可读不可修改的 )
int const a = 13;
int b = 30;
(1)a=23; //错误,const修饰a,所以不能改变a的值
(2)int const *p; //const修饰的是*p,所以不能改变*p
p=&a; //正确
*p=23; //错误 不能通过*p改变a的值
(3)const int *p; //const修饰的是*p
p=&a; //正确
*p=23; //错误
(4)int *const p=&a; //const修饰的是p
p=&b; //错误 不能改变p
*p=20; //正确
(5)int const * const p; //const修饰*p,也修饰p,所以*p,p都不能改变
p=&b; //错误
*p=20; //错误
注意:const修饰变量的原则是离谁近修饰谁。const int *p与int const *p完全一样。
4.指针与数组
待续。。。。

589





