#include<stdio.h>
void foo1(const char**p)
{ }
void foo2(const char*p)
{ }
int main(int argc,char **argv)
{
foo1(argv);
char *p;
foo2(p);
return ;
}

为什么第一个调用有警告,第二个没有?

要解释这个问题,真是破费心机。

ANSI C 6.3.16.1节对于简单赋值这样描述:

两个操作数都是指向有限定符或者无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。

(在顶层const时不再适用!)

函数调用时,实参传递给形参,相当于赋值操作。

当第一次阅读到这个问题时,我是没有理解透彻的,《c专家编程》对这里的描述也是模棱两可,直到学习了c++之后,才算明白。

先看《c专家编程》上对这里的描述:

正是因为看了这本书,在学习c++的时候,刚开始一直很疑惑,为什么c++这里和c语言不一样,到后来,我明白了,是《c专家编程》这里讲解还是不够。对于上面的描述,我们做如下测试:

    char *cp;
char * const p="abc";
cp=p;

这样的赋值不会有警告,是不是和《c专家编程》描述有出入呢?在c++的学习中,我知道了,顶层const在赋值时会被忽略,在C语言中,也是同样的道理。所以,多多阅读书籍才能更好的提高。回到之前的话题,char *赋值给const char *不会有任何警告,证明它们是相容的,那为什么char ** 赋值给const char **就会有警告呢?

ANSI C 并没有对上述情况加以解释说明,但是在6.1.2.5节中这样讲述:

const float * 类型并不是一个有限定符的类型(在我当初阅读的时候,觉得这里和她上面的举例是矛盾的,这里没有限定符,那上面那个例子不就是说自身有一个const限定符吗?后来我发现,上面所说的限定符仅仅是指const,也并没有说是指针的呀!)---它的类型是“指向一个具有const限定符的float类型的指针”,也就是说const限定符修饰的是指针所指向的类型,而不是指针本身。

类似地,const char **也是一个没有限定符修饰的指针类型(注意这里的描述是对于指针类型的)。它的类型是“指向有const限定符的char类型的指针的指针”。由于它和char **一样都是没有限定符的指针类型,但它们指向的类型不一样,一个指向const char * ,一个指向char * 。因此它们是不相容的。虽然char *可以赋值给const cahr *,但是相容性不能传递,那么const char **与char **还是不相容。

最新文章

  1. Mybatis学习(一)
  2. python &amp; c
  3. [转] 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误
  4. SQL Server 内存中OLTP内部机制概述(四)
  5. PLSQL_基础系列02_分组函数GROUP BY / ROLLUP / CUBE(案例)
  6. ZOJ-3201 Tree of Tree 树形DP
  7. C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍(转)
  8. ios Swift 特性
  9. Hibernate连接MySQL数据库乱码相关问题
  10. 04747_Java语言程序设计(一)_第10章_网络与数据库编程基础
  11. linux判断日期是否合法
  12. POJ 3041 Asteroids(匈牙利+邻接表)
  13. C#中DataGridView 对XML文档的使用
  14. 基于 EntityFramework、Autofac 的 UnitOfWork 框架(一)
  15. djjango安装及其 操作命令
  16. Linux常用命令(三)查看当前计算机各方面信息
  17. C语言里有没有像C++里面的sort函数一样的函数?有!
  18. YOU AND ME 不见不散(转载)
  19. 【洛谷P1858】多人背包
  20. crontab挂定时任务

热门文章

  1. Cannot load supported formats: Cannot run program &quot;svn&quot;
  2. PLY格式介绍
  3. 配置的好的Apache和PHP语言的环境下,如何在Apache目录下htdocs/html目录下 同时部署两个项目呢
  4. Android蓝牙A2DP连接实现
  5. 使用PhoneGap开发基于Html5应用二:第一个PhoneGap应用:百度
  6. 用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
  7. HDUOJ ------1398
  8. ios NSURLSession使用说明及后台工作流程分析
  9. ubuntu(14.4) 安装phpmyadmin
  10. 用minGW编译ffmpeg(供替换opencv中引用的ffmpeg库)