【C/C++】与const有关的指针类型赋值
一级指针相互赋值
int a=10;int *p1=&a;
const int *p2=&a;
int * const p3=&a;int *q1=&a;
const int *q2=&a;
int *const q3=&a;
p1=q1; 可以。int * -> int *
p1=q2; 不可以。const int *p1 -> int *p2
const修饰类型为int,修饰内容为*p1,也即*p1不可改变。把p1给了p2,有可能通过改变*p2而改变了*p1。
p1=q3; 可以。int *const p1 -> int *p2
const修饰类型为int *,修饰内容为p1,也即p1不可改变。把p1给p2,p1不作为左值,是可以的。
p2=q1; 可以。int *p1 -> const int *p2
const修饰类型为int,修饰内容为*p2,也即*p2不可改变。把p1给了p2,只是改变了p2。
p2=q2; 可以。const int * -> const int * 相同类型之间赋值
p2=q3; 可以。int * const p1 -> const int *p2
const修饰类型为int *,修饰内容为p1,也即p1不可改变;
const修饰类型为int,修饰内容为*p2,也即*p2不可改变。把p1给了p2。
p3=q1; 不可以。int *p1 -> int * const p2
const修饰类型为int *,修饰内容为p2。所以把p2当左值的操作都是不允许的。
p3=q2; 不可以
p3=q3; 不可以
二级指针相互赋值
int a = 10;
int *b = &a;
const int * c = &a;int** p1;
const int **p2;
int *const *p3;
int **const p4 = &b;int** q1;
const int **q2;
int *const *q3;
int **const q4 = &b;
如果赋值符两边const修饰的类型中都有*号,可以将两边的*删掉,做简化。简化后如果只剩一级指针,就当一级指针看。如果不能简化,二级指针要看双向,任何一方都不允许改变对方,要保证两边都不被泄露。
p1 = q1; 可以。int ** p1 -> int ** p2
p1 = q2; 不可以。const int ** p1 -> int ** p2
const修饰的类型是int,修饰的内容是**p1,也即**p1不许改变。将p1给了p2,有可能通过改变**p2而改变了**p1。
p1 = q3; 不可以。int const *p1 -> int * p2
const修饰的类型是int,修饰的内容是*p1,也即*p1不许改变。将p1给了p2,可能通过改变*p2而改变*p1。
p1 = q4; 可以。int const p1 -> int p2
p1不可改变,将p1给了p2。
p2 = q1; 不可以。int ** p1 -> const int ** p2
**p2不可以改变,将p1给了p2,**p1的改变会带来**p2的改变。(看双向)
p2 = q2; 可以。const int ** -> const int **
p2 = q3; 不可以。int * const *p1 -> const int ** p2
*p1不可改变,**p2不可改变。将p1给了p2,改变*p2会带来*p1的改变。
p2 = q4; 不可以。int ** const p1 -> const int ** p2
p1不可改变,**p2不可改变。将p1给了p2,改变**p1会带来**p2的改变。
p3 = q1; 可以。int * p1 -> int const * p2
去了*,就当一级指针,不用看双向。*p2不可改变。将p1给了p2。
p3 = q2; 不可以。const int ** p1 -> int * const * p2
**p1不可改变,*p2不可改变。把p1给了p2,改变**p2可能带来**p1的改变。
p3 = q3; 可以。int *const * p1 -> int * const * p2
p3 = q4; 可以。int * const p1 -> int const * p2
p1不可以改变,*p2不可以改变。把p1给了p2。
p4 = q1; 不可以。int ** p1 -> int ** const p2
p2不可以改变,所以把p2当做左值的操作都是不允许的。
p4 = q2; 不可以。
p4 = q3; 不可以。
p4 = q4; 不可以。
【C/C++】与const有关的指针类型赋值相关推荐
- opendir 从不兼容的指针类型赋值
// open DIRs DIR *dir;struct dirent *dirp;if ((dp=opendir(fullpath))==NULL){write_log("No such ...
- Primer笔记——typedef指针类型别名时的const陷阱
目录 一.typedef int* pint 与 const pint 二.typedef const int *pint 与 pint 三.总结 <C++ Primer>中指出,type ...
- [C++] 指向常量的指针 VS 指针类型的常量
指向常量的指针 VS 指针类型的常量 const 修饰指针时的位置不同,作用也不相同. 1. 指向常量的指针 不能通过指向常量的指针改变所指对象的值,但指针本身可以改变,可以指向另外的对象. 例: i ...
- C++ 指向常量的指针与指针类型的常量
(1)声明指向常量的指针时,不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象. #include<iostream>using namespace std;int m ...
- C++中void和void*指针的含义 (指针类型的含义)
转载自:http://blog.csdn.net/lee_shuai 指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型:编译器根据指针的类型从指针指向的地址向后寻 ...
- 指针类型和指针类型转换的理解
前几天在判断 "值相同的两个指针所指向的变量的值可以不同 " 这句话时,发现自己对指针类型一些概念仅仅是记住了结论.于是查阅了一些资料,记录一下一些与指针类型和指针类型转化相关 ...
- C++类指针类型的成员变量的浅复制与深复制
本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...
- 理解复杂的C/C++声明 const, typedef , 函数指针(转贴)
让我们从一个非常简单的例子开始,如下: int n; 这个应该被理解为"declare n as an int"(n是一个int型的变量). 接下去来看一下指针变量,如下: int ...
- c++ 表达式必须包含指向类的指针类型_C++:18const关键字(附常量指针、指针常量、常量指针常量)...
一.const变量的一些基本特点 ①const修饰的变量不能被修改 const int a=10; a=20;//错误 ②因为const修饰的变量不能被修改,所以必须被初始化 int a=10; co ...
最新文章
- python程序采用unicode编码、英文字符,Python 与 Unicode
- python【蓝桥杯vip练习题库】ALGO-69字符串逆序
- 需求工程-软件需求模式读书笔记3
- 记录第一次使用jni编译so包的入门操作
- 【转载】WinCE中串口驱动及接口函数介绍
- NYOJ 721 纸牌游戏 简单题
- C++primer第九章 顺序容器 9.1 顺序容器概述 9.2容器库概览
- 从有理数到实数和数的连续体
- lm723大电流可调电源电路图_高稳定大电流直流可调稳压电路
- ZZULIOJ 1107: 回文数猜想(函数专题)
- 常用JS库源码 - store.js源码/underscore.js源码
- 【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南
- eclipse编辑器未包含main类型_Shopify模版编辑器问题排查及解决办法汇总
- mootools温习与深入_Element_1
- 微信公众号接入百度天气API接口
- 推荐一个Oracle数据库学习的网站
- 基于elementui的年月日周时间控件
- VirtualBox虚拟机安装教程
- #pragma once用法
- 优雅的git commit
热门文章
- Ubuntu下apache配置文件路径
- Truncate Table 删除表内容避免产生过多日志
- Timus 1079. Maximum
- Ngrok让你的本地Web应用暴露在公网上
- 蓝桥杯 ALGO-28 算法训练 星际交流
- 【Sublime】Mac下Sublime代码自动换行
- 最新快手面试题(含总结):设计模式+红黑树+Java锁+Redis等
- 【Vue】详解 SFC 与 vue-loader
- width 、 height 与 box-sizing : border-box ,content-box 的关系
- Linux 文件夹和文件大小排序