细谈const char ** 与 char ** 的区别

原创 2011年01月12日 19:21:00

      程序出现了错误,很明显是类型转换时类型不匹配(const char ** 和 char **)。为了较详细的分析这个问题,我们先看看下面这个程序。

 

     毫无疑问,这个典型的程序成功的运行了。p0是指向有const限定符的char类型的指针,也就是p0指向const char类型,而p1指向char类型的指针,即p1指向char。所以,比较p0和p1就是比较const char 和 char。众所周知,const char是绝对不能用char来赋值的,即const char c1= char c2。但是指向const char类型的指针p0却可以用指向char类型的指针p1赋值,即p0=p1。这个类型转换还有一个明显的特征就是const char类型是char类型的const形式。这里我们由程序总结出这样一个规律:
     const type * p1;
     type * p2;
     p1=p2;
注意:两个'type'表示相同的类型(int ,char,char*...... )。

      让我们再回到最初的那个问题——const char ** p0和 char ** p1的区别。首先,根据《C陷阱与缺陷》中的“大嘴原则”(编译器会从左至右尽可能的将最长的字符串组合成一个有意义的标识),p0是指向“const char *” 的指针,p1是指向“char *”的指针。你可能会这样想,const char * 不正是 char * 的const形式吗?但是人的第一直觉往往是错的,不要相信自己的眼睛,用心去分析。const char * 是一个指针类型,它指向const char类型,而char * 也是一个指针,它指向char类型。哈哈,我想你已经恍然大悟了,const char * 和 char *根本就是两个不同类型的指针,换句话说,const char * 根本就不是 char * 的const形式。你现在一定在想“char * 的const形式是什么?它与const char * 有什么不同?”,如果你没有这样想,我先在这里道歉,请原谅我的自大,呵呵。char * p的const形式就是char * const p。如果你已经明白了,那么请忽视我接下来的罗里罗嗦。const char * p表示p指向const char 类型,也就是说p这个指针本身并不是const的,p是可以作为左值的(可以被多次赋值),只是p指向的变量是const的(p不可以通过解引用*p去修改p指向的变量)。明白了原理之后,我们编写一个测试程序试一下。

上面讨论的错误经常发生在函数传参的时候,例如:

正确的函数参数类型写法是这样的。

 

 

 

 

 

 

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

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

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

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

C++中char*与wchar_t*之间的转换

代码编译运行环境:VC++2012+Debug+Win321.问题描述char字符与wchar_t字符由于编码不同,所以在char*和wchar_t*之间使用强制类型转换达不到正确转换字符串的目的。考...
  • K346K346
  • K346K346
  • 2015年11月28日 11:46
  • 6606

C语言练习题auto break case char const

  • 2010年01月27日 08:51
  • 67KB
  • 下载

(const) char 转CString 详解(字符串类型转换详解,不断补充)

  • 2013年05月04日 14:02
  • 8KB
  • 下载

浅谈mysql中varchar(m)与char(n)的区别与联系

对这varchar和char这两个数据类型最简单区分是:varchar存放变长字符串,char存放定长字符串。那么他们是否还有其他差别呢?本文将从浅显的层次以抛出问题解决问题的形式对两者的区分进一步了...
  • zhengwish
  • zhengwish
  • 2016年03月01日 17:44
  • 2607

浅谈mysql中varchar(m)与char(n)的区别与联系

对这varchar和char这两个数据类型最简单区分是:varchar存放变长字符串,char存放定长字符串。那么他们是否 还有其他差别呢?本文将从浅显的层次以抛出问题解决问题的形式对两者的区分进一...
  • zh521zh
  • zh521zh
  • 2017年09月11日 10:21
  • 106

浅谈Oracle 中 varchar2(N) 与 varchar2(N char) 的区别

在oracle数据库表结构中,我们往往会看到varchar2的两种使用方式,如,varchar2(16)、varchar2(16 char),那么这两者有什么区别呢?现在我们实际的例子看一下: 1、...
  • YangLiehui
  • YangLiehui
  • 2015年10月29日 09:15
  • 2867

Java 中 char 与 byte 的区别

  • 2015年08月07日 15:11
  • 15KB
  • 下载

转 String,CString,TCHAR,char之间区别和联系

  • 2013年10月09日 18:52
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:细谈const char ** 与 char ** 的区别
举报原因:
原因补充:

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