c语言限定符,C语言的限定符修饰问题_TJNiiiaaann的博客-程序员宅基地

技术标签: c语言限定符  

foo(const char **p) {}

main(int argc, char **argv)

{

foo(argv)

}

如果编译这段代码,编译器会发出一条警告信息如下:warning: argument is incompatible with prototype

一般情况很多人会认为实参char *s 与形参 const char *p 应该是相容的,标准库中所有的字符串处理函数都是这样的。那么为什么 实参char **argv 与形参 const char **p 实际上不相容呢?

答案是肯定的,它们并不相容,在ANSI标准中有以下的概念:Each argument shall have a type such that its value may be assigned to an object with the unqualified version of the type of its corresponding parameter.

每个实参都应该具有自己的类型,这样它的值就可以赋值给与它对应的形参类型的对象(该对象的类型不能含有`限定符`)

这就是说参数的传递过程类似于赋值

所以,除非一个类型为char **的值可以赋值给一个 const char ** 类型的对象,否则肯定会产生一条诊断信息。要想知道这个赋值是否合法,需要满足以下的约束条件其中一个:1、两个操作数都是指向有限定符或无限定符的相容类型的指针

2、左边指针指向的类型必须具有右边指针所指向类型的全部限定符

正是这个条件,使得函数中调用实参char *能够与const char *匹配。它之所以合法,是因为在下面的代码中:char *cp;

const char *cpp;

ccp = cp左操作数是一个指向有const限定符的char的指针

右操作数是一个指向没有限定符的char的指针

char类型与char类型是相容的,左边操作数所指向的类型具有右操作数所指向类型的限定符(无),再加上自身的限定符(const)。

注意,反过来就不能够赋值,如下:cp = cpp;

char **实参 与 const char **形参是相容的? 没有!!!

举个例子:const float *类型并不是一个有限定符的类型,它的类型是“指向一个有const限定符的float类型的指针”。也就是说const限定符修饰指针所指向的类型,而不是指针本身

由于char **和const char ** 都是没有限定符的指针类型,但它们所指向的类型不一样(前者指向的是char *,后者指向的是const char*),因此它们是不相容的。

举例:char *a = "123";

const char **b;

const char *c;

char **d;

b = &a; //OK

c = a; //OK

a = c; //有警告

b = d; //有警告!

d = b; //有警告

const最有用的用法就是用它限定函数的形参,这样该函数将不会修改实参指针所指的数据,但其它函数却可能会修改它。简单地讲,就是char **与 const char **类型并不兼容(imcompatble)。进一步说,就是如果C语言允许这样,就会产生与引人const这个关键字本意自相矛盾的结果,const就变得一点意义都没有了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36124750/article/details/117108422

智能推荐

linux中怎么中断程序,linux 中断调用过程_群青色黑洞的博客-程序员宅基地

每个中断处理的函数存放在entry.S中的interrupt数组中,该数组有NR_IRQS个元素.每个元素做的工作有:ENTRY(irq_entries_start).reptNR_IRQSALIGN1:pushl$vector-256jmpcommon_interrupt.data.long1b.textvector=vector+1.endrALIGNcommon_interru...

算法分析-基础-02_persistenthuang的博客-程序员宅基地

算法分析定义:分析算法占用的计算机资源情况目的:设计算法:设计出复杂度尽可能低的算法选择算法:选择复杂度最低的算法、时间复杂度定义:算法运行所需要的时间资源的量方法:事后实验统计法事前分析估算法:渐近分析空间复杂度定义:算法分析所需要的空间资源的量...

linux下db2中在命令行状态下如何实现db2实例,linux下DB2中在命令行状态下如何实现DB2实例?(2)..._肛肠外科陈医生的博客-程序员宅基地

5.配置远程连接端口首先为远程连接配置空闲端口: (查看端口使用情况命令: netstat -na | grep 50000 查看50000端口是否已使用中 )vi /etc/services 查看分配给DB2实例DB2inst2的端口. 返回结果中db这一块的有#LocalservicesDB2_DB2inst160000/tcpDB2_DB2inst1_160001/tcpDB2_DB...

1088 三人行 (20 分)_weixin_34290096的博客-程序员宅基地

#include <bits/stdc++.h>using namespace std;void print(double a,int b){ if(a>b){ cout<<" Cong"; } else if(a==b){ cout<<" Ping"; } ...

xtrabackup备份和恢复MySQL_weixin_34217711的博客-程序员宅基地

xtrabackup有两个主要的工具:innobackupex和xtrabackup,xtrabackup只能备份InnoDB和XtraDB数据表,innobackupex封装了xtrabackup,可以备份MyISAM数据表。MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。Xtraback...

mysql like having_like模糊查询、HAVING和wehere_weixin_39905695的博客-程序员宅基地

我的笔记:like模糊查询:总结:’%’和’_’可以在任意位置使用,只需要记住%能够表示任意个字符,_只能表示一个任意字符例如:select * from user where user.name like ‘b%’表示查询b开头的所有数据‘%b’表示查询以b结尾的所有数据‘_b_’表示查询类似aba的任意中间为b的三位字符第一个理解:分组查询group by,根据某个字段对记录分组例如:根据id...

随便推点

赖美云的认证照_真人秀及综艺类双榜单 TOP10 嘉宾热度认证,赖美云双面魅力引热议..._weixin_39742065的博客-程序员宅基地

网易娱乐 3 月 26 日报道 近日关于 2 月份全国综艺类节目传播影响力分析结果发布,偶像歌手赖美云凭借在多档综艺节目中的亮眼表现给人留下深刻印象,其中真人秀类节目《横冲直撞 20 岁》和演艺类节目《即刻电音》这两档节目中,赖美云的表现尤其突出。这两档综艺也为赖美云赢得了真人秀及演艺类节目嘉宾热度 TOP10 的殊荣。在真人秀节目《横冲直撞 20 岁》中,可爱担当赖美云流露出了独属于 20 岁少...

android 提高启动速度慢,提高App的启动速度,你真的做对了吗?_Wang Namelos的博客-程序员宅基地

1、前言App的启动速度是用户对于App的第一印象,如果App启动的很慢那非常有可能导致用户的流失,因此对于App的启动速度可以说是我们必须要保障的一道关卡!接下来我给大家介绍一下App启动速度优化的常用方案。2、衡量启动时间要想优化启动速度首先我们需要知道怎么精确获取App的启动速度,只有先拿到了精确的启动速度才好评估时间到底有多久以及后续的优化效果。对启动速度优化有经验的同学都知道使用 adb...

u盘插上后在计算机里找不到盘,win7系统插入u盘后计算机磁盘界面找不到u盘盘符的解决方法..._滴哩滴哩的博客-程序员宅基地

很多小伙伴都遇到过win7系统插入u盘后计算机磁盘界面找不到u盘盘符的困惑吧,一些朋友看过网上零散的win7系统插入u盘后计算机磁盘界面找不到u盘盘符的处理方法,并没有完完全全明白win7系统插入u盘后计算机磁盘界面找不到u盘盘符是如何解决的,今天小编准备了简单的解决办法,只需要按照  1、将桌面上所有程序和软件窗口都最小化,然后在桌面上右键单击一下“计算机”图标,在弹出来的菜单中选择“管理”; ...

gui open 连接失败_MINIGUI常见错误集及解决方法_鄜州npc的博客-程序员宅基地

MINIGUI错误集1:一般网上都是说动态编译MiniGUI,然后把编译好的可执行文件和MiniGUI的库,资源文件和配置文件拷贝到linux的根文件系统,但是如果是这样必然还要拷贝ld.so和lib.c.so,后者相当大,好象不太可行.我就想看看静态编译一个应用程序如何,但是出错(动态编译这个应用程序是对了的,libminigui是事先编好了的,有*.so和*.a),它报了一些数学的库函数未解析...

声卡设备alsa音频架构1_weixin_34356555的博客-程序员宅基地

最近研讨声卡设备,稍微总结一下,后以继续补充: 第一分部 alsa子系统症结构结体对象等    1.声卡设备类型定义#define SNDRV_DEV_TOPLEVEL ((__force snd_device_type_t) 0)#define SNDRV_DEV_CONTROL ((__force snd_device_type_t) 1) #define SNDRV_DE...

使用opcache为你的网站加速(转载)_alexlee0123的博客-程序员宅基地

[文章作者:磨延城转载请注明原文出处:https://mo2g.com/view/137/]可能很多朋友在接触PHP的时候或多或少了解到:PHP是脚本语言、一种解释型语言,所以它不需要经过编译就能运行,诸如此类. 这种说法虽然并不完全正确,但对于初学者来说,这么理解或许还比较合适,不仅能快速入门,调试代码还挺方便.但当你想要优化基于PHP开发的网站,以支持更高的并发访问时,...

推荐文章

热门文章

相关标签