目录练习一:一级指针指向练习题练习二:二级指针指向练习题A选项;B选项;C选项;D选项;E选项;总结在c++中,const作用于指针时,可以看做是对指针权限的限制。这里我们先把指针的
在c++中,const作用于指针时,可以看做是对指针权限的限制。这里我们先把指针的权限归为两种,分别为指向权限和修改权限。(ps:以上是为了理解方便,实际并没有如此规定)
int a = 10, b = 20;
int* p = &a;
p = &b; // 改变指向的权限 ✔
*p = 30; // 修改内存的权限 ✔
const int* cp = &a; // 限制修改权限
/
int* const p2 = &a;
int* q2 = p2;
int* const p3 = &a;
int* const q3 = p3;
int* const p4 = &a;
const int* q4 = p4;
题目二:下列表达式语句错误的有。
// 选项A
int a = 10;
int* p1 = &a;
const int** q1 = &p1;
// 选项B
int a = 10;
int* p2 = &a;
int* const* q2 = &p2;
// 选项C
int a = 10;
int* p3 = &a;
int** const q3 = &p3;
// 选项D
int a = 10;
int* const p4 = &a;
int** q4 = &p4;
// 选项E
int a = 10;
const int* p5 = &a;
int* const* q5 = &p5;
答案:(鼠标选中查看)
?错误:A、D、E,正确:B、C?
错误; 注:如果const修饰的是二级指针,我们需要对二级指针的逐层解引用进行分析。
int* p1 = &a;
const int** q1 = &p1; //error 无法从“int * *”转换为“const int** ”
int* p1 = &a;
p1的类型为int*
取地址为 int **
const int** q1 = &p1;
q1的类型为 const int **
则指针赋值过程为 const int ** <= int* *
分析:
a
的值进行修改。a
修改的风险,因此无法直接赋值。修改方案:
const int * p1= &a;
const int** q1 = &p1;
const int * const * q1;
// 方案一
const int* p12 = &a;
const int** q12 = &p12;
// 方案二
int* p11 = &a;
const int* const* q11 = &p1;
正确; 注:如果const修饰的是一级指针,我们可以抛开二级指针的表象,但看一级指针的赋值操作是否正确。如本例。
int* p2 = &a;
int* const* q2 = &p2;
正确; 注:如果两边类型相同,则无需进行判断。如本例。
int* p3 = &a;
int** const q3 = &p3;
cout << typeid(q3).name() << endl; //输出 q3 类型 int * *
ps:如果const修饰的参数右边无“*”号,则该cosnt不作用于类型。如:
int n = 10;
// 使用typeid(valtypr).name() 输出变量类型
int const* p1 = &n; // int const *
int* const p2 = &n; // int * // 忽略const
int* p = &n;
int** q = &p;
//int const** q1 = &p;
int const* const* q1 = &p; // int const* const*
int* const* q2 = &p; // int* const*
int** const q3 = &p; // int** // 忽略cosnt
错误; 同B选项相同,对于const修饰的一级指针进行判即可。
int* const p4 = &a;
int** q4 = &p4; //error "int *const *"类型的值不能用于初始化"int **类型的实体
int* const p4 = &a;
类型为 int*
,因为const的存在,取地址后类型为 int * const *
int** q4 = &p4;
类型为 int**
则指针赋值过程为 int** <== int* const*
分析:
* <== const*
,//忽略 int 部分,该部分赋值时权限没有发生变化。int* <== int const *
,给指针确定一个类型,如“int” 类型修改方案:
int* <== int const *
型赋值改成 int const* <== int const *
类型赋值即,int*const* q4 = &p4;
错误; 注:如果赋值两边都有const时,各论各的分析,如下。
const int* p5 = &a;
int* const* q5 = &p5; //error 无法从"const int **"转换为"int *const *"
分析:
int* const* <== const int* *
int* <== const int*
,错误 ✖cosnt * <== *
即 int const * <== int *
,正确 ✔修改方案:
1.修改指针左边类型:int* <== const int*
⇒ int* <= int*
2.修改指针左边类型:int* <== const int*
⇒ const int* <= const int*
//1 int* <= int*
int* p51 = &a; // const int* p5 ⇒ int* p51
int* const* q51 = &p51;
//2 const int* <= const int*
const int* p52 = &a;
const int* const* q52 = &p52; // int* const* q5 ⇒ const int* const* q52
方法总结:
对于二级指针的赋值操作判断,看const位置、主要有以下两种情况:
int const **
,如选项A。我们需要考虑其解引用情况。cosnt修饰二级指针所指向的值为常量,但是由于一次解引用后的指针会存在修改常量的风险,因此我们需要限制该指针与常量之间进行过度的一级指针const int* cosnt* <== int**
或 左边等式有两个cosnt ,const int* cosnt* <== int**
。1.const修饰的是一级指针,int * const *
,如选项B。单独剥离出含cosnt类型的一级指针类型进行分析
2.即修饰一级指针又修饰二级指针 如, int cosnt * cosnt *
3.无const修饰 如, int**
或 int ** cosnt
,如选项C、选项D
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!
--结束END--
本文标题: 一起来练习C++的指针
本文链接: https://lsjlt.com/news/141716.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0