目录
一、const的解释
const
是 C 语言中的一个关键字,主要用于声明一个只读变量,也就是说这个变量的值在初始化后就不能被修改。使用 const
可以提高代码的可读性和可维护性,同时也有助于编译器进行某些优化。
二、const用来定义常量
const int a = 1;
const可以用来定义常量,这些常量在程序运行时不能改变,上面定义了一个常量a,这个时候你如果对其值做出了改变,编译器就会报错。
但是却可以间接通过指针的方式来修改a的值,像下面这段代码
int main() {
const int a = 1;
int* p = &a;
printf("修改前:%d\n",*p);
printf("修改后:%d\n",++(*p));
printf("a的值为:%d\n",a);
return 0;
}
运行后的结果:
三、const修饰指针变量
对于const修饰指针变量我们有一个原则就是“就近原则”。
1、情况一修饰的是*p
#include <stdio.h>
int main() {
int num = 10;
const int *p = #
//int const *p = # 等价于上面那行代码
++p;//不报错
num++;//不报错
(*p)++;//编译报错
return 0;
}
编译上面这段代码会出现以下结果
(*p)++不行,++p可以
这种情况说明了const在这里修饰的是*p,不能通过指针来修改它所指向的值,但是却可以改变指针变量p所指向的地址。
2、情况二修饰的是p
看下面这段代码
int main() {
int num = 10;
int* const p = #
num++;//不报错
(*p)++;//不报错
p++;//编译报错
return 0;
}
编译上面这段代码
p++不行,(*p)++却可以
这说明了const在这里修饰的是p,不能通过指针变量p去改变它所指向的地址,但是却可以通过指针的方式修改num的值。
3、情况三既修饰p又修饰*p
int main() {
int num = 10;
const int* const p = #
num++;
(*p)++;//编译报错
p++;//编译报错
return 0;
}
上面这种情况不管是通过p去改变其地址还是通过*p去改变num的值都不可以
四、修饰函数返回值
1、函数返回值是通过值传递返回
此时加上const则没有意义。因为函数会把返回值复制到外部寄存器中,然后再对这个寄存器的值进行操作
const int test30() //没有意义的
{
const int num = 10;
return num;
}
int main()
{
int a = test30();
++a;
printf("a=%d\n",a);
return 0;
}
这里a依然会加1
2、返回值是以"地址传递"的方式进行返回
const char* GetString(void);
这里接收返回值必须是被const修饰的同类型指针
const char*str = GetString();
返回值只能被赋给加const 修饰的同类型指针
五、在函数参数中使用const
1、防止修改指针指向的内容
void print_arr(const int *arr, int size)
{
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
2、防止修改指针所指向的地址
void swap1( int* const p1 , int* const p2 );