首页 > 试题广场 >

如下代码段,哪种描述是正确的()

[单选题]

如下代码段,哪种描述是正确的()


  • 全部正确
  • 2错,1,3正确
  • 1,2错,3正确
  • 1正确,2,3,错
1对,是一个简单的引用传参。
这个题关键是要理解2为什么错了,用visual studio编译报错原因是无法从“T**”转化为"const T**"。原因如下:
C++不允许从const T*转换为T*,除非使用const_cast显示地转除const限定符。考虑一个情形:
const int d = 0;
const int*c = &d;
int e = 1;
int *f = &e
int **b = &f;
const int **a = b;//我们假设可以编译通过
*a = c;// 这句是对的,因为c 是const int*型,*a也是const int *型
乍一看没有问题,但是因为用b初始化了a,修改*a也就修改了*b,此时*a和*b都指向了c!再看c是const int*,而*b是 int*型!间接导致了从const int*型到int *型的转换!是不是就破坏了上面加粗的规则!
所以int**不能转换为const int**!!! 如果理解了上述过程,也就能明白为什么3是对的了,如果把a定义为const int * const *a = b; 自然也就不能改变*a的值,这句*a = c就错了,所以不会出现上述破坏规则的情况。( 当然,3理解成传参的时候顶层const可以忽略,底层const必须保持一致或者可以转换也能说的过去,转换的意思是非const量可以转换成const)

编辑于 2020-09-16 17:27:43 回复(1)
1:const A*&p形参限定的是A*的内容,ca刚好限定了A*指向的内容。
2错误点:首先,p是一个二级指针,且指向是A*,根据题目给的信息,A* 指向的内容是可修改的,
但是f()函数中的形参 const A** p 的意思就是 p的指向可以改,A*的指向也可以改,但是A*指向的内容不可更改,参数转换出错,所以编译是不通过的。
3:g(const A* const* p) 其实左边的const是没有实际意义的,const限定的是*A的指向,并没有限定*A指向的内容,和参数p是刚好匹配的

发表于 2020-09-11 11:14:39 回复(2)
题目是错的
图中的代码,A**p = &a 这一句压根就无法过编.再问后面的是否正确没什么意义
发表于 2021-02-19 21:00:28 回复(2)
首先无法从**转换为const**,这个记住了,想转换的话得在*中间加一个const
发表于 2022-09-23 17:27:37 回复(0)

int a = 0;

int *p = &a;

int **pp = &p;

const int i = 0;

const int *q = &i;

const int **qq = pp; //假设这里可以通过,qq指向了p

*qq = q;

//好了,现在p指向i了


作者:冒泡
链接:https://www.zhihu.com/question/263742072/answer/272568252
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发表于 2023-03-01 11:18:05 回复(0)
不会主动报错,但是编译的时候2确实会报错

错误    C2664    “void f(const A **)”: 无法将参数 1 从“A **”转换为“const A **”    CPP基础    E:\code\Cplusrepo\CPP基础\进程.cpp    18    



发表于 2022-09-15 17:06:25 回复(0)
普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响
发表于 2020-09-10 18:50:10 回复(0)
不能将一个非const常量赋给一个const常量,但是反过来可以
发表于 2020-08-04 22:23:39 回复(3)
注意const关键字
发表于 2023-09-16 16:55:22 回复(0)
非const转为const会生成临时const变量 对临时const变量的指向修改无意义 直接报错
发表于 2023-08-22 13:27:45 回复(0)
第二种:无法将参数  从“A **”转换为“const A **
发表于 2022-09-28 16:28:39 回复(0)
发表于 2022-07-13 11:18:14 回复(0)
3为什么对啊?有大神解答一下吗

发表于 2020-08-21 17:38:00 回复(1)