const char* const 问题

原创 2011年01月07日 17:39:00

这是很经典的问题,很多C语言的初级面试都会碰到。今天在这里重提是因为我以前一直没有真正理解,我是死记得:

const char* p: p指向的内容是常量,但是p是常量指针
char* const p: p指向的内容是变量,但是p是指针常量

因为我没有真正理解,所以稍微一变化我就傻了:
template <class T>
void getStrT(const T& val)   {…}   //

void getStr(const char*& val){…}  //

const char* p="This is Arrowpig!";
getStr(strdup(p));     //1.
getStrT(strdup(p));   //2.

结果getStrT是成功编译的,但是 getStr碰到编译错:
error: invalid initialization of non-const reference of type ‘const char*&’ from a temporary of type ‘char*’

我诈一看,getStr和getStrT一样的啊,T不就是char* 吗,那const T& 不就是const char* &吗!李楠倒是一针见血的就指出来区别const T& => const (char*)& 。后来我跟徐晨再过了一遍,变量定义的方式是和将来使用变量的方式一样的

例子:
const char*& p: 把该定义看成表达式求值,*,&都是单元运算符,右结合–>(const char)(*(&p))。p是一个引用,引用的对象是指针,对指针解引用后得到的类型是const char,所以指针指向的内容是const。

const T& p: 把定义看成表达式求值–> (const T)(&p), p是引用,引用的类型是const T,当T=char *的时候等价const (char*),指针本身是const。–>引用的类型是指针常量。

好,回过头来看,strdup返回char*, 但是由于我直接把strdup放在参数中,char* 是个临时变量,C++编译器会自动给临时变量赋于const属性,所以gcc报的错误中a temporary of type ‘char*’的意思就是 const (char*)= char * const。当我们调用getStr的时候,我们试图把 指针常量 转成 常量指针的引用,所以就出错了 。但是当调用getStrT时,我们试图把 指针常量 转成 指针常量的引用,当然是可以的

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题

关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题   CString csNewListBoxText; CString csO...
  • biyusr
  • biyusr
  • 2012-04-16 09:37
  • 1856

关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题

CString csNewListBoxText; CString csOldListBoxText(g_csFirstListBoxSelText); if(strcmp(csNewListBo...

const char to LPCTSTR不能转化问题

转自: http://skpsun.blog.163.com/blog/static/2760055200810142505251/ Visual C++ 2008里cannot convert ...

关于CString剖析,"strcmp": 不能将参数1从"CString”"转换为"const char *"问题

CString csNewListBoxText; CString csOldListBoxText(g_csFirstListBoxSelText); if(strcmp(csNewListBoxT...

“QT中QString 转const char*为乱码或为空的问题 ”之解决方案

接着前篇:http://blog.csdn.net/bzhxuexi/article/details/17111903 在前篇中遇到了一个问题,当时没解决,今天终于找到了解决方法,我在网上看到了这样...

const char to LPCTSTR不能转化问题

error C2664: “gethostbyname”: 不能将参数 1 从“CString”转换为“const char *”   我在VC的unicode项目中使用如下代码时,提示错误“e...
  • wjeson
  • wjeson
  • 2012-03-14 14:54
  • 3406

VS2010 编码问题 不能将参数 1 从“ATL::CStringT<BaseType,StringTraits>”转换为“const char *”

一、 使用函数_tcscpy_s: CStringtheString( "This is a test" );  int   sizeOfString = (theString.GetLengt...

MFC遇到的一个字符集问题:不能将参数1从“const char []”转换为“LPCTSTR”

今天在使用vs2008+MFC时候,使用editControl的replacesel(“”)发生报错。如下::不能将参数1从“const char []”转换为“LPCTSTR”其解决方案就是, 在项...
  • kkk328
  • kkk328
  • 2011-07-18 09:31
  • 2708
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)