const修饰的双重指针赋值解惑
在c程序中,我们可能经常会使用到指针之间的赋值。
传统的赋值操作:
char *cp = "c";
const char *ccp;
ccp = cp;
printf("*ccp:%c",*ccp);
会正常打印出*cpp所指的字符。但是下面的这段代码,就会出现问题:
char **c = &cp;
const char **cc;
cc = c;
printf("**cc:%c",**cc);
编译的时候提示,出现错误:
>------ 已启动生成: 项目: oj1511, 配置: Debug Win32 ------
>生成启动时间为 // ::。
>InitializeBuildStatus:
> 正在创建“Debug\oj1511.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
>ClCompile:
> oj1510.cpp
>e:\workspace\oj1511\oj1511\oj1510.cpp(): error C2440: “=”: 无法从“char **”转换为“const char **”
> 转换丢失限定符
>
>生成失败。
>
>已用时间 ::00.36
========== 生成: 成功 个,失败 个,最新 个,跳过 个 ==========
这是为什么呢?
原来还是const修订符搞的怪:
第一段代码中:
cp是一个指向char类型的指针。
ccp是一个const修饰符修饰的指向char类型的指针,也就是说,它指向的是char类型,但是指针本身是不可修改的。
在ANSI C标准中,有这么一段:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边的指针所指向的类型必须具有右边的全部限定符。
也就是说: ccp是一个指向有const修饰符的指针,cp是一个指向没有const修饰符的指针。ccp中包含了cp的所有修饰符(其实cp就没啥修饰符),因此可以进行赋值。
这样,我们看一下面的代码:
c是一个指向char类型指针的指针。
cc是一个指向const修饰符修饰的char类型的指针的指针。
cc 与 c指向的内容并不相同,因此无法进行赋值操作。因此出现提示错误:error C2440: “=”: 无法从“char **”转换为“const char **”
const修饰的双重指针赋值解惑的更多相关文章
- C++中使用const修饰指针
在本文中呢,主要讲解四个方面,即:常量数据的与否和常量指针的与否中const如何对指针进行修饰: 1.指向非常量数据的常量指针 对于一个指向非常量数据的常量指针,我们应该清楚的知道,在这我们注重的是指 ...
- const修饰指针的三种效果
当用const进行修饰时,根据const位置的不同有三种不同效果. 判断的标准是:const修饰谁,谁的内容就是不可变的. 1 const int *p = &a; const修饰*p, *p ...
- C++ --const修饰指针
const修饰指针 1.const修饰指针 (常量指针)常量的指针 const int *p = &a; const修饰的是*p(表示内容为常量),不是p(指针) 指针指向的地址可以改,但指针 ...
- C++中const修饰基本数据类型、指针、引用、对象
const修饰基本数据类型 #include <iostream> using namespace std; void main(){ const int a = 1; const cha ...
- const修饰指针+volatile +restrict
const这块的难点 const修饰指针有以下的几种形式 ,不同的形式 它的意义不一样. 形式1: int a=23: const int *p=&a: a是int型,&a是int * ...
- const修饰指针
关于const修饰指针的情况,一般分为如下4种情况: ; const int *a =&b; //情况1 int const *a =&b; //情况2 int* const a =& ...
- C语言--const修饰指针解析
这种例子在我们平时编程时可能会很少用,但是在面试时被问的可能性就很大了. 用const修饰指针,常见的情况可以分为四种: 1.const int *p; // p 可变,p 指向的对象不可 ...
- 关于const修饰指针
const修饰指针,一般分为如下四种情况: int b = 500; const int *a = &b; //情况1 int const *a = &b // 2 ...
- 如果输入参数采用“指针传递”,那么加 const 修饰可以防止意外地改动该指针,起 到保护作用
如果输入参数采用“指针传递”,那么加 const 修饰可以防止意外地改动该指针,起 到保护作用. #include <iostream> /* run this program using ...
随机推荐
- windows2003 IIS6网络负载平衡设置
问题 随着计算机技术的不断发展,单台计算机的性能和可靠性越来越高.但现实中还是有许多应用是单台计算机难以达到,例如: 1.银行存储用户数据的数据库服务器必须保证24小时不间断的运转,并在发生严重硬件故 ...
- LeetCode Binary Tree Preorder Traversal 先根遍历
题意:给一棵树,求其先根遍历的结果. 思路: (1)深搜法: /** * Definition for a binary tree node. * struct TreeNode { * int va ...
- pip
查看安装的包 pip list
- RTP协议分析
目录(?)[-] 第1章 RTP概述 RTP是什么 RTP的应用环境 相关概念 流媒体 第2章 RTP详解 RTP的协议层次 传输层的子层 应用层的一部分 RTP的封装 RTCP的 ...
- cimge 这次能够图片大小尺寸
CImage imSrc,imDest;imSrc.Load(……);//读入原始图片imDest.Create(……)//创建新大小的图片imSrc.StretchBlt(imDest.GetDC( ...
- Meta标签详解(转)
引言 您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中登录自己的个人网站 ● 在知名网站加入你个 ...
- 六款最佳Linux教育应用
导读 对教育行业的用户来说,有好几款专门的Linux发行版是专门面向教育行业的.本文将介绍适合教育领域的几款顶级发行版. 1.Edubuntu 位居榜首的是Edubuntu.顾名思义,Edubuntu ...
- java web 学习一
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- Jedis的Sharded源代码分析
概述 Jedis是Redis官方推荐的Java客户端,更多Redis的客户端可以参考Redis官网客户端列表.当业务的数据量非常庞大时,需要考虑将数据存储到多个缓存节点上,如何定位数据应该存储的节点, ...
- Google Maps API显示地图的小示例
来源:http://www.ido321.com/1089.html 效果(新版Firefox中测试): 代码: <!DOCTYPE> <html> <head> ...