C语言
文章目录
- C语言
- 前言
- 一、const
- 二、const和指针
- const int *p1 或 int const *p1
- int *const p2
- 三、函数参数
- 总结
前言
这篇文章来看一看const关键字
一、const
有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。
例如,用一个变量来表示表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定:
const int Num = 100;
这样 Num 的值就不能被修改了,任何对 Num 赋值的行为都将引发错误:
Num = 90; //错误,试图向 const 变量写入数据
我们经常将 const 变量称为常量(Constant)。创建常量的格式通常为:
const type name = value;
int main()
{
int n = 90; const int Num1= n; //运行时初始化 const int Num2= 10; //编译时初始化 }
二、const和指针
const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序,如下所示:
const int *p1 或 int const *p1
这是一种“指向常量的指针”。指针 p1 指向的数据是常量,这意味着你不能通过 p1 修改它所指向的值,但你可以改变 p1 自身指向的地址
#include <stdio.h>int main() {int a = 10;int b = 20;const int *p1 = &a; // p1 指向整型常量,不能通过 p1 修改 a 的值printf("Value pointed by p1: %d\n", *p1);// *p1 = 15; // 编译错误:不能通过 p1 修改 a 的值p1 = &b; // 这合法:p1 可以指向不同的地址printf("Value pointed by p1 now: %d\n", *p1);return 0;
}
p1本身的值(地址)可以修改(指向不同的数据),但它们指向的数据不能被修改。
int *const p2
#include <stdio.h>int main() {int a = 10;int b = 20;int *const p2 = &a; // p2 是常量指针,指向 a,p2 的值(地址)不能被改变printf("Value pointed by p2: %d\n", *p2);*p2 = 15; // 这合法:可以通过 p2 修改 a 的值printf("Value of a after modification: %d\n", a);// p2 = &b; // 编译错误:不能改变 p2 的值(即不能使 p2 指向其他地址)return 0;
}
当然,指针本身和它指向的数据都有可能是只读的,下面的两种写法能够做到这一点
const int *const p4;//指向常量的常量指针:既不可以改变指针指向,也不可以修改指针所指向的内容。
int const *const p5;
三、函数参数
使用const修饰函数参数,表明该参数在函数内部不会被修改,增强了函数接口的清晰度和安全性。
void Value(const int value) {// 可以读取value,但不能修改valueprintf("%d\n", value);
}void Change(int* const a, int* const b) {// 在此函数中,a和b的地址都不能更改,但可以通过它们交换指向内容的值int temp = *a;*a = *b;*b = temp;
}
函数返回const类型的指针,意味着返回的对象是不可修改的。
const char* get(void) {static char str[] = "const";// 返回一个指向常量字符串的指针return str;
}
总结
使用const关键字定义常量名称时,建议使用大写字母,以区分常量与变量。
• 当需要传递不可修改的参数给函数时,使用const修饰指针或引用。有助于提高代码的可读性和安全性。例如:#define PI 3.14可以被替换为 const float PI = 3.14。
• 在函数参数和返回值中使用"const"关键字,以确保数据不被意外修改。有助于提高代码的安全性和可维护性。例如:void String(const char* str);
• 修饰全局变量,将全局变量声明为"const",确保在程序的任何地方都不会被修改。