指针基本概述
在C语言中,系统会根据类型为变量分配对应长度的空间,编译器可以通过变量名来访问这个变量。当要读取某个变量时,在编译时编译器根据变量名所在的地址和数据类型读取数据。
指针就是地址的意思,一般的变量存的是数据,而指针变量存的是指针,即指针变量是存放地址的变量。指针变量的类型就是存放地址指向的数据类型。指针占四个字节的大小,用于存放地址。
当编译器要调用指针存储的数据时,由于指针变量存放的是地址,所以会直接得到这个地址里的数据。
如果需要获取某个变量的地址,可以使用取地址运算符(&):
char *pa = &a;
int *pb = &b;
pa = &c;
这三行代码分别定义了字符型指针pa,整型指针pb,并将变量c的地址赋给了pa。
如果需要访问指针变量指向的数据,可以使用取值运算符(*):
print("%c,%d\n",*pa,*pb);
print("%c,%d\n",pa,pb);
如果输出上面两行代码,第一行会输出一个字符和一个整型数据,第二行则会输出两个地址。
接下来是本篇的重点——const!!!
指向const变量的指针
首先,我们要明确,const修饰的变量无法被修改。
const int i = 100;
这里的100是无法被修改的,如果为i再次赋值,程序就会报错。因此,我们常用这个关键字来保护我们不希望被改变的变量。
如果我们对i进行取址:
int *pi = &i;
编译器也会报错,大概意思就是将“ const int* ”转化成 “ int* ”是无效的。要定义一个指向const变量的指针,我们只需要在指针前面加上const:
const int *pi = &i;
实际上,只要const在取值运算符(*)左边,指针都可以正常使用:
int const *pi = &i;
const修饰的指针
const修饰的变量只能由指向const变量的指针去指向,此外这个指针也可以指向别的普通变量。被const修饰的指针,它指向的地址是不能被改变的,但是该地址的值可以被改变。
i = 10;
int *const pi = &i;
i = 20;
在上述代码中,i的值可以不是固定的,但是其地址不允许变动。
恶心的东西
看完上面的东西,大家不妨思考一下下面这句话是什么意思:
int const *const pa = &i;
如果没有上面的铺垫,相信大家都会觉得这个东西很恶心。但是看完整篇文章之后,大家就会知道:
这是被const修饰的指向const变量的指针。这个变量的值和指针指向的地址都不允许改变。