对C中const修饰指针的使用和理解

const用于定义常量类型,限定某些变量不允许修改。

const修饰指针时的原则:先忽略掉类型说明符,离谁近就修饰谁

1. 常量指针

常量指针:是指向常量的指针,指针指向地址中的内容是不可修改的,但是指针的指向是可以修改。

定义方式,以下2种都可以:

  1. const dataType *ptrName;
  2. dataType const *ptrName;
int a = 20;
int b = 30;
const int *ptr_i = &a;
// *ptr_i = 30; // 报错:read-only variable is not assignable 只读变量不可赋值
ptr_i = &b; // OK的

指针指向的内容不可修改,即:*ptrName(解引用时)表示的值不修改。

const修饰的是*ptr_i,所以不能修改的是就是 *ptr_i 的值。

2. 常指针(指针常量)

常指针:是指针类型的常量,即指针本身的值不可以修改,始终指向一个地址。因此常指针初始化需要给定一个地址值。但是指向地址的内容可以修改

定义方式,以下方式都是可以的(必须要初始化设置值):

  1. dataType *const ptrName;
  2. const *dataType ptrName;
int a = 20;
int *const ptr1 = &a;
//ptr1 = NULL; // 报错:cannot assign to variable 'ptr1' with const-qualified type 'int *const' 
*ptr1 = 30; // OK的

// 使用 typedef 定义一个别名
typedef int * intp_t;
int b = 30;
const intp_t p2 = &b;
p2 = &a; // 报错:表达式必须是可修改的左值

指针本身的值不可以修改,ptr1的值是&a,不可以修改,指针指向地址的内容可以修改即*ptr1(解引用时)表示的值可以修改。

const修饰的是ptr1,所以ptr1的值不能修改。

通过 typedef 定义指针类型别名intp_t后,再使用const 修饰 intp_t 变量,修饰的是指针本身,即指针本身的指向不可以修改。

3. 常指针&常量指针的复合使用

int a = 30;
const int *const ptr_a = &a; 

指针的地址值和地址值的内容 都不可以修改。

第一个const 修饰的是 *ptr_a,所以 *ptr_a 的值不能修改。

第二个const 修饰的是 ptr_a,所以 ptr_a的值也不能修改。

4. 其他

const 常用于修饰函数的参数,防止函数内部修改外部变量。