const和指针
前言
在C语言中,const配合指针使用是常有的。但使用的时候很容易出错,所以记录必须弄清楚原理性的东西。所以记录一下学习过程...
一、const的限定
指针是const
表示一旦得到了某一个变量的地址,不能再指向其他变量。换句话说:这个指针是一个常量,而常量是不能变的。
举例代码:
#include <stdio.h>
int main(void)
{
int a = 60;
int *const p_a = &a;
printf("%d\n", *p_a);
p_a++;
return 0;
}
IDE报错提示:表达式必须是可修改的左值

所指是const
表示不能通过这个指针去修改那个变量(但并不能使得那个变量成为const)。换句话说:仅限定不能通过这个指针通过间接访问去修改所指的地址的值,所指地址的值自己可以改变,但对于指针本身是没有限制的,指针可以指向别的地址。
代码举例1:
#include <stdio.h>
int main(void)
{
int a = 60;
const int *p_a = &a;
*p_a = 16;
return 0;
}
IDE报错提示:表达式必须是可修改的左值

代码举例2:
#include <stdio.h>
int main(void)
{
int a = 60;
const int *p_a = &a;
printf("%d\n", *p_a);
a = 16;
printf("%d\n", *p_a);
int b = 30;
p_a = &b;
printf("%d\n", *p_a);
return 0;
}
运行结果:

二、const结合指针的优势
当要传递的参数的类型比地址还大的时候,常用的手段是:把一个非const的值转换成const,这种手段的优势是既能用比较少的字节数传递值给参数,又能避免函数对外面的变量的修改。
函数对于参数的处理方式:对于传递值进来的,先复制一份。如何这个传递值很大呢(比如结构体),复制所需要的时间就会变长。对于传递地址进来的,直接操作地址,速度很快。直接把结构体的指针传进去不就可以了吗? 但是我们要求函数不能对结构体的值进行修改,所以我们要对结构体指针要加以限定const,这样处理既可以加快处理速度,也能防止误修改结构体的值。

浙公网安备 33010602011771号