代码示例是最好的讲解方式:
str[] = "I love China"; //这里str是头指针,可以通过str改动字符串:str[2] = 'U';
case 1:通过const限定p指向的内容(value);这里str本身是可以修改的,但不能通过p去修改字符串的值。
const在*的前面,限定的就是*x的东西,*x就是值。
const char * p = str; //char const * p = str 等价, 限制的是*p(p的内容),即,p指向的内容不能通过p被修改,但可以通过str自己修改。
case2:通过const限定p,而不是p的指向的值。
const在*的后面,限定的就是x,x就是那个地址(指针),而不是它指向的value。
char * const p = str; // 限制的是p,所以,p不能执行p++这样的操作。
同理,看以下的引用也是修改的value:
int ii = 8;
const &pii = ii;
ii = 9; //OK,ii自己并没有被const限定,const限定pii,不会影响到ii的属性。
pii = 10; //这里会报错,因为pii被const限定,它指向的value不能通过pii修改。
这个const限定的也是值。
const int &b = 32; //这里的引用其实分配了内存保存32。
const修改入参:
这样就使得实参类型更加灵活(可以传入const int &def;也可以直接传入立即数)
也更加安全,不容易被无意改动原本不应该被改动的参数。
void func(const int &readonly)
{
readonly = 5; // error:不能被修改,编译失败。
}
const int &def = 9;
func(def);