在C中const作用于指针时可以看做是对指针权限的限制。这里我们先把指针的权限归为两种分别为指向权限和修改权限。ps:以上是为了理解方便实际并没有如此规定12345678910inta 10, b 20;int* p a;p b;// 改变指向的权限 ✔*p 30;// 修改内存的权限 ✔constint* cp a;// 限制修改权限//*cp 100; // error表达式必须是可修改的左值 修改 ✖cp b;// ok. 指向 ✔int*constpa a;// 限制指向权限*pa 100;// ok. 修改 ✔//pa b; // error表达式必须是可修改的左值 指向 ✖指针的赋值一般遵守权限缩小式的赋值。例如我有一本书我有使用权限我可以看可以做笔记借给你后你只有阅读权限只能看不能做笔记。当然如果我们关系好我可以赋予你使用权你拥有读写的权利。同样的指针的赋值也是如此。1234567inta 10;int* p a;// int* int *int* q p;// int* int*constint* cp p;// const int* int* 权限缩小✔int*constpa p;// int* int* 注意int* const pa;是“int*”类型//int* p1 cp; // errorint* const int * 权限放大✖int* p2 pa;// ok. int* int*我们可以得出一级指针赋值的公式123int* int*// int* 包含 int* 和 int* const类型intconst* int*// int const * 等同 const int *// 以上公式反过来赋值就是错误的..练习一一级指针指向练习题题目一下列表达式语句赋值错误的是123456789101112inta 10;constint* p a;int* q p;inta 10;int*constp a;int* q p;inta 10;int*constp a;int*constq p;inta 10;int*constp a;constint* q p;答案(鼠标选中查看错误A正确B、C、D解析123456789101112131415161718192021inta 10;constint* p1 a;int* q1 p1;// error无法从const int * 转为 int */* 分析int* cosnt int**/int*constp2 a;int* q2 p2;/* 分析int* int**/int*constp3 a;int*constq3 p3;/* 分析int* int**/int*constp4 a;constint* q4 p4;/* 分析cosnt int* int**/练习二二级指针指向练习题题目二下列表达式语句错误的有。1234567891011121314151617181920// 选项Ainta 10;int* p1 a;constint** q1 p1;// 选项Binta 10;int* p2 a;int*const* q2 p2;// 选项Cinta 10;int* p3 a;int**constq3 p3;// 选项Dinta 10;int*constp4 a;int** q4 p4;// 选项Einta 10;constint* p5 a;int*const* q5 p5;答案(鼠标选中查看错误A、D、E正确B、CA选项错误; 注如果const修饰的是二级指针我们需要对二级指针的逐层解引用进行分析。12int* p1 a;constint** q1 p1;//error 无法从“int * *”转换为“const int** ”int* p1 a;p1的类型为int*取地址为int **const int** q1 p1;q1的类型为const int **则指针赋值过程为const int ** int* *分析const作用于**q1修饰二级指针。表示不可通过q1对a的值进行修改。*q1解引用一次后为一级指针即p1。但是p1存在对a修改的风险因此无法直接赋值。修改方案方案一直接限定一级指针p1。保证p1不会修改a的值即const int * p1 a;const int** q1 p1;方案二间接限定q1使其指向时缩小权限对解引用后的*q1修改的权限做出限制如const int * const * q1;1234567// 方案一constint* p12 a;constint** q12 p12;// 方案二int* p11 a;constint*const* q11 p1;B选项正确; 注如果const修饰的是一级指针我们可以抛开二级指针的表象但看一级指针的赋值操作是否正确。如本例。123456789int* p2 a;int*const* q2 p2;/* 分析int* const* int* *const修饰 *q2即cosnt修饰一级指针cosnt* * // 去掉前面的 int* int*int const * int * // 添加一个任意类型如int如所示这是一个权限缩小的一级指针赋值✔*/C选项正确; 注如果两边类型相同则无需进行判断。如本例。1234567int* p3 a;int**constq3 p3;cout typeid(q3).name() endl;//输出 q3 类型 int * */* 分析int**const int* * 即 int** int* *两边类型相同无需进行特殊判断✔*/ps如果const修饰的参数右边无“*”号则该cosnt不作用于类型。如12345678910intn 10;// 使用typeid(valtypr).name() 输出变量类型intconst* p1 n;// int const *int*constp2 n;// int * // 忽略constint* p n;int** q p;//int const** q1 p;intconst*const* q1 p;// int const* const*int*const* q2 p;// int* const*int**constq3 p;// int** // 忽略cosntD选项错误; 同B选项相同对于const修饰的一级指针进行判即可。12int*constp4 a;int** q4 p4;//error int *const *类型的值不能用于初始化int **类型的实体int* const p4 a;类型为int*因为const的存在取地址后类型为int * const *int** q4 p4;类型为int**则指针赋值过程为int** int* const*