C语言新世界大门的钥匙——指针

话不多说直接上干货!

目录

1.什么是指针?

( !)高级指针

2.常量指针和指针常量

3.const修饰指针

4.指针与数组


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.指针与数组

                  待续。。。。          

评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值