博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
const char**与char**之间赋值问题
阅读量:5035 次
发布时间:2019-06-12

本文共 1058 字,大约阅读时间需要 3 分钟。

问题

#include 
int main(){ char* name[] = {"hello", "world"}; char **cp = name; const char** ccp = cp; return 0;}

编译器给出了一条警告:warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] const char** ccp = cp;,即赋值等号两边的类型不相容。

原因

标准中有关合法形式赋值的约束条件:

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

而在上述代码中,指针cp指向的类型为char*,而指针ccp指向的类型为const char*,两个变量所指向的类型不相容,因此编译器会给出警告。那么为什么char*const char*不相容呢?这是因为const char*中的const修饰的不是指针本身,而是指针所指向的对象,类似于int*double*是不相容的。

正确的写法

#include 
int main(){ char* name[] = {"hello", "world"}; char **cp = name; char * const * ccp = cp; // OK return 0;}

在上述代码中,指针ccp指向的类型为char * const(带const限定的指向char的指针类型),指针cp指向的类型为char *(不带const限定的指向char的指针类型),因此是相容的。

扩展

const与*一起出现的时候,const究竟修饰的是谁呢?

int const * p1; // const修饰的是指针p1所指向的int类型对象int * const p2; // const修饰的是指针p2int * const * p3; // const修饰的是指针p3所指向的指针int * const * const p4; // 第一个const修饰的是指针p4所指向的指针,第二个const修饰的是指针p4

总结成一句话,即const修饰的是其左边的对象。

转载于:https://www.cnblogs.com/jiangling500/p/8367629.html

你可能感兴趣的文章
数据分析 -- 白话一下什么是决策树模型(转载)
查看>>
Java SPI机制原理和使用场景
查看>>
web前端java script学习2017.7.18
查看>>
删除TXPlatform
查看>>
LaTex:图片排版
查看>>
并发访问超时的问题可能性(引用)
查看>>
中小团队基于Docker的Devops实践
查看>>
利用python打开摄像头并保存
查看>>
System函数的使用说明
查看>>
Selenium-测试对象操作之:获取浏览器滚动条滚动距离
查看>>
Linux下MySQL数据库安装与配置
查看>>
Extjs String转Json
查看>>
oracle入门(4)——少而常用的命令
查看>>
打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机...
查看>>
Java 虚拟机部分面试题
查看>>
JS中 String/JSON 方法总结
查看>>
二叉树的遍历问题总结
查看>>
3.14-3.20周总结
查看>>
Spring之面向切面编程AOP
查看>>
MATLAB GUI程序设计中使文本框接收多行输入的方法
查看>>