指针常量和常量指针
前段时间一直在敲代码,没什么时间总结。趁着今天休息,小小的总结了一下指针常量和常量指针的内容。指针常量和常量指针这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;
}