目录
1.const 类型限定符
以 const 关键字声明的对象,在 定义之后 (或 初始化之后),其值 不能 再通过 复制 或 递增、递减 来修改.
例如
const int a = 99;// 限定变量 a 的值不可被修改
a = 100;// 编译器会报错
1.1 const 修饰指针
const 修饰指针时,其在 * 星号前还是后的位置决定了修饰的对象.
const 在 * 前
const type * var_name 或者 type const * var_name
const 在 星号前、类型名后 表示它修饰的是 指针所指向的对象,即 指针所指向的对象的值 不可再修改,
但是 指针本身可以修改,可以指向另一个对象.
int a = 0;
int b = 0;
const int* pa = &a;
*pa = 1;// 不行,だめ哦
pa = &b;// OK,某问题啦
const 在 * 后
type * const var_name
const 在 星号后、变量名前 表示它修饰的是 指针本身,即 指针 不可以再指向其他对象,
但是 指针所指向的对象的值是可以修改的.
int a = 0;
int b = 0;
int* pa = &a;
pa = &b;// 不行,だめ哦
*pa = 1;// OK,某问题啦
1.2 const 修饰形参
假设有一个函数要调用 Show() 自定义函数显示一个数组的内容,要把数组名作为 实参 传递给函数,可数组名也代表 数组的首元素地址,所以该函数有可能更改数组中的数据.
但是如果用 const 修饰函数的形参就不会更改原内容:
void Show(const int arr[], int size)
/* 或者 */void Show(const int* arr, int size)
这两种声明的效果是一样的,表明不能更改 arr 指向的内容
以后在定义函数时,若形参是指针,要想使用它而不改变它从而影响主调函数中的实参时,就用 const 关键字进行修饰.
举个例子,字符串函数 strcat 的函数原型为:
char* strcat(char* str1, const char* str2);
strcat 函数用于在 第一个字符串的末尾 添加 第二个字符串的拷贝副本,更改了第一个字符串,而未更改第二个字符串.
2.volatile 类型限定符
3.restrict 类型限定符
restrict 是只能用于 指针 的关键字(要写在 * 星号后面),表明该指针是访问数据对象的 唯一 且 初始 的方式。
int arr[10];
int* parr = arr;
int* restrict block = (int*)malloc(sizeof(int));
在上面,访问数组 arr 中的元素数据可以直接通过数组访问,也可以通过指针 parr 访问,
所以指针 parr 既不是访问 arr 数组中数据的初始方式,也不是唯一方式,所以不用 restrict 修饰它.
而指针 block 是访问由 malloc() 所分配的内存的唯一且初始的方式,所以用 restrict 修饰它.
所以 restrict 到底有何用?