细谈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指向的变量)。明白了原理之后,我们编写一个测试程序试一下。

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

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

 

 

 

 

 

 

相关文章推荐

双向链表的实现与操作(C语言实现)

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表...

数据结构——10 双向链表插入和删除节点

双向链表——插入、删除指定位置和相同节点

C语言练习题auto break case char const

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

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

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

Java 中 char 与 byte 的区别

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

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

在oracle数据库表结构中,我们往往会看到varchar2的两种使用方式,如,varchar2(16)、varchar2(16 char),那么这两者有什么区别呢?现在我们实际的例子看一下: 1、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:细谈const char ** 与 char ** 的区别
举报原因:
原因补充:

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