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时,我们试图把 指针常量 转成 指针常量的引用,当然是可以的

string、const char*、 char* 、char[]相互转换(全)

string、const char*、 char* 、char[]四者类型经常会需要转化。 一:转化总结形式如下: 使用时,要对源格式和目标格式进行初始化。源格式赋值为具体的内容,目标格式赋值为空...
  • rongrongyaofeiqi
  • rongrongyaofeiqi
  • 2016年09月05日 17:39
  • 4045

解决不能从CONST CHAR *转换为LPCWSTR

有时候复制了整个框架程序确发现有编译不通过的问题,命名人家的程序编译能通过,到了自己编译的时候却编译不能通过,这个时候也许有各种问题,有些问题让人匪夷所思。编译器有时候会根据编码方式来选择定义为LPC...
  • linjingtu
  • linjingtu
  • 2016年11月16日 19:31
  • 2802

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

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

c++中string、const char*和char*之间的相互转换

在调试c++程序的时候经常会遇见字符串的问题,由于c++中即兼容了原来的c形式的字符串char *,又有自己的特殊的字符串类string,在一些程序中由于接口的存在需要进行转换。 c++语言提供了两...
  • zhaofrjx
  • zhaofrjx
  • 2016年04月04日 15:33
  • 2870

CString与const char*的相互转换

前篇: ①CString强制类型转换为const char*,在变量前加上:(char *)(LPCTSTR),这样做虽不会报错,但其转换后的值可能是乱码,不推荐这样做! ②利用中间变量(string...
  • shuaiqidiudiu
  • shuaiqidiudiu
  • 2013年05月13日 10:40
  • 4698

"const char*"类型的实参与LPCTSTR类型的形参不兼容

"const char*"类型的实参与LPCTSTR类型的形参不兼容 1、LPCTSTR是什么? A  32-bit pointer to a contant character stir...
  • oLaiBa
  • oLaiBa
  • 2014年03月17日 15:10
  • 3900

const char*、char*及字符串常量的正确使用

const char*和char*的转换是老生常谈了,但是很少有人把它们和字符串常量一起分析,本人觉得这是搞清楚他们的一个关键。 下面是一个简单的测试程序: 编译环境:windows、vs2010 #...
  • cuishumao
  • cuishumao
  • 2013年08月23日 19:00
  • 2645

Java调用C++(包含jstring到const char*字符串转化) 及其c++调用java字符串传递

C++中头文件声明。 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)  #include   #include "platform/android/jn...
  • themagickeyjianan
  • themagickeyjianan
  • 2014年08月03日 13:23
  • 950

C语言const与指针——为什么不能用char **给const char **赋值

C语言中,const限定词指定了一个不可修改的变量,但并不是常量。它可以使编译器帮助我们保证某些变量不被意外修改,例如指针或引用传递时,加上const可保证我们的源数据不被破坏。const修饰指针时情...
  • sunnylgz
  • sunnylgz
  • 2013年12月11日 12:36
  • 1583

对char * const *(*next)(); char * (*c[10])(int **p)的理解从而引发的对函数指针的理解以及const修饰符的用法理解

首先来看下这两句代码: char * const *(*next)(); char * (*c[10])(int **p) 如果不是对函数指针有一定了解的人就会一头雾水,并不清楚这两句代码是什么意思,...
  • u013041681
  • u013041681
  • 2015年12月13日 01:21
  • 771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:const char* const 问题
举报原因:
原因补充:

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