const修饰符表示只读,为了内存的安全性,程序的可读性等等原因,常常会给指定的内存分配不同的权限。(新手容易忽略这些问题)
在C/C++开发中使用的更加广泛,函数参数,类的构造函数的参数,全局变量等等地方经常使用。
下面的代码解释了指针和指针数组的权限分配。
备注:
new int (66)是分配1个int内存,并赋值为66
new int [66]是分配66个int内存,不会赋值,可以用 memset(void *, int, size_t) 全部赋值为0
#pragma mark - 指针权限
// 可以修改指针所指向的内存中的值,但不可以指向新的内存
int *const i1 = new int (66);
i1 = new int (71); // Error, Read-only variable is not assignable
*i1 = 7;
// 可以指向新的内存,但不可以修改指针所指向的内存中的值
int const *i2 = new int (66);
i2 = new int (72);
*i2 = 7; // Error, Read-only variable is not assignable
// 和上面一个权限分配相同
const int *i3 = new int (66);
i3 = new int [2];
*i3 = 7; // Error, Read-only variable is not assignable
// 不可以修改指针所指向的内存中的值,也不可以指向新的内存
const int *const i4 = new int (66);
i4 = new int [2]; // Error, Read-only variable is not assignable
*i4 = 7; // Error, Read-only variable is not assignable
#pragma mark - 指针数组权限
// 可以修改数组中指针所指向的内存中的值,但数组中指针不可以指向新的内存,数组也不可以指向新的内存
int *const ii1[] = {new int (66), new int (67), new int (68)};
ii1 = {new int (7)}; // Error, Read-only variable is not assignable
ii1 = {new int (77), new int (77), new int (77)}; // Error, Read-only variable is not assignable
ii1[0] = new int (8); // Error, Read-only variable is not assignable
*ii1[0] = 9;
// 数组中指针可以指向新的内存,但不可以修改数组中指针所指向的内存中的值,数组也不可以指向新的内存
int const *ii2[] = {new int (66), new int (66), new int (66)};
ii2 = {new int (7), new int (7), new int (7)}; // Error, Array type 'const int *[3]' is not assignable
ii2[0] = new int (8);
*ii2[0] = 9; // Error, Read-only variable is not assignable
// 和上面一个权限分配相同
const int *ii3[] = {new int (66), new int (66), new int (66)};
ii3 = {new int (7)}; // Error, Array type 'const int *[3]' is not assignable
ii3[0] = new int (8);
*ii3[0] = 9; // Error, Read-only variable is not assignable
// 不可以修改数组中指针所指向的内存中的值,数组中指针也不可以指向新的内存,数组也不可以指向新的内存
const int *const ii4[] = {new int (66), new int (66), new int (66)};
ii4 = {new int (7)}; // Error, Read-only variable is not assignable
ii4[0] = new int (8); // Error, Read-only variable is not assignable
*ii4[0] = 9; // Error, Read-only variable is not assignable