常量指针和指针常量

指针常量和常量指针

前段时间一直在敲代码,没什么时间总结。趁着今天休息,小小的总结了一下指针常量和常量指针的内容。指针常量和常量指针这2个名词相当的绕口,但如果好好的理解它们的区别,要分别出来还是挺容易的。

const关键字

首先谈谈const这个关键字的作用,在命名一个局部变量的时候,前面加上const关键字的话(用const修饰的变量名),在程序运行的过程中,就不可以通过这个变量名去修改它所代表的存储区的值。通过const关键字修饰的局部变量的变量名,对其代表的地址只有读权限,意味着不能修改其代表的存储空间的内容。用const修饰的全局变量或静态变量,它们的存储区会落在只读常量区,所以任何方法也不能改变它们代表的存储区的值。


例 一 :
#include <stdio.h>

int main(void)
{
    const int a = 10;
    a = 20;	//编译错误

    return 0;
}

编译会报错,原因是声明变a的时候在前面加了const关键字。只能通过a来读取a代表的地址的数据,不能通过a来修改a锁代表的地址数据。但这不代表a所代表的存储空间是只读的,我们可以用一个指针变量记录a的地址,然后通过解引用的方式去修改a所代表的地址的数据。

 

指针常量

指针常量的命名:

 (数据类型*)(const 关键字)(变量名)

如:int* const p;

用我自己的意思去解释这句话就是,开辟一块内存空间,这块内存空间存储的内容是int*的数据,然后用变量名p去代表这块内存空间,但由于p前面有一个const关键字,所以变量名p对这块存储空间只拥有读权限。那么就不能通过变量名p去修改p所代表的地址的数据了。

指针常量捆绑了一个存储空间后,就不能捆绑其它存储空间了,但可以修改它所捆绑的存储空间上的数据。

所以我们可以这样理解它的命名方式:

(数据类型*)(const 关键字   变量名)

例 二 :


#include <stdio.h>

int main(void)
{
    const int a = 10; 
    int b = 0;
    //a = 20;   编译报错

    int* const p = &a; 
    //p = b;    编译报错

    *p = 20;
    printf("a == %d\n", a);

    return 0;
}

在例二中,p是一个指针常量,不能通过p修改p所代表的地址的数据,但p存储的地址上的数据是可以修改的。

在C语言中,数组名称其实就是一个指针常量,所以对数组名称进行自增或自减操作的时候,编译也是不会通过的。

 

常量指针

常量指针的命名:

(1)const int *p;

(2)int const *p;

与指针常量恰好相反,常量指针捆绑了一个存储空间后,可以再去捆绑其它的存储空间,但不能修改它所捆绑的存储空间上的数据。

例 三 :

#include <stdio.h>

int main(void)
{
    const int a = 10; 
    int b = 0;
    //a = 20;   编译报错

    int* const p = &a;  //定义一个指针常量
    //p = b;    编译报错

    *p = 20;
    printf("a == %d\n", a);

    const int* p2 = &a; //定义一个常量指针
    p2 = &b;
    //*p2 = 30; 编译报错 

    return 0;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值