c进阶篇(四)——const用法详解

前言:
  const是c的关键词,可以修饰变量、函数形参、指针,用法相对多样。

1 修饰非指针变量

  被 const 修饰的全局或局部变量,其值被初始化后不能再被修改,变量将变为 只读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdio.h"

const a = 10; //定义全局常量

int Fun()
{
return 5;
}

int main(void)
{
const int b = 10; //定义局部常量
const int c = Fun(); //定义局部常量,初始值为Fun返回值

a = 1; //Error: 全局常量值不能被修改
b = 1; //Error: 局部常量值不能被修改
c = 1;

printf("%d, %d, %d\n", a, b, c);
}

2 修饰指针变量

  const和指针变量的搭配,根据const的位置可以分为五种情况。

  • const int * p : const限制指针指向的变量是只读,但不限制指针指向修改;
  • int const * p : 同上面一样,const限制指针指向的变量是只读,但不限制指针指向修改;
  • int * const p : const限制指针指向不能改变,但指向的变量值可以改变;
  • const int * const p = &a : const限制了指针的指向不能改变,同时指针指向的变量值也不能改变;
  • int const * const p = &a : 同上面一样,const限制了指针的指向不能改变,同时指针指向的变量值也不能改变;

2.1 const int * pint const * p

1
2
3
4
5
6
7
8
9
10
11
#include "stdio.h"

int main(void)
{
int a = 5;
const int * p = &a; //const限定指针指向的变量是只读,但不限制指针指向修改

*p = 10; //Error: 不能通过指针修改指针所指向变量的值
p = NULL; //可以修改指针的指向
a = 6; //可以直接修改变量的值
}

2.2 int * const p

1
2
3
4
5
6
7
8
9
10
11
#include "stdio.h"

int main(void)
{
int a = 5;
int * const p = &a; //const限定指针指向不可改变,但指针指向的变量值可改变

*p = 10; //指针指向的变量值可改变
p = NULL; //Error: 指针指向不能改变
a = 6; //可以直接修改变量的值
}

2.3 const int * const p = &aint const * const p = &a

1
2
3
4
5
6
7
8
9
10
11
#include "stdio.h"

int main(void)
{
int a = 5;
const int * const p = &a; //const限制了指针的指向不能改变,同时指针指向的变量值也不能改变

*p = 10; //Error: 指针指向的变量值不能改变
p = NULL; //Error: 指针指向不能改变
a = 6; //可以直接修改变量的值
}

3 运用在函数形参

  const运用在函数形参其实还是对变量的修饰,语法上没有什么特殊,只是介绍下这种运用场景。形参使用const是为了增加函数封装的安全性和可读性。
  以下是const在函数形参修饰变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdio.h"

void Fun(const int b)
{
b = 10; //Error: b为只读常量,不能被修改
}

int main(void)
{
int a = 5;

Fun(a);
}

  以下是const在函数形参修饰指针变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdio.h"

void Fun(const int * const p)
{
*p = 10; //Error: 不能修改指针指向的变量值
p = NULL; //Error: 不能修改指针指向
}

int main(void)
{
int a = 5;

Fun(&a);
}