例看const与指针兼容性

在单层运算的前提下:

将常量或非常量数据的地址赋给指向常量的指针是合法的:普通类型和const类型指针 -> const类型指针

const int array1[4] = {0,1,2,3};
int array2[4] = {0,1,2,3};
const int *pr = array1;  //合法
pr = array2;  		 //合法

可只有非常量数据的地址才可以赋给普通的指针:普通类型指针只能 -> 普通类型指针

const int array1[4] = {0,1,2,3};
int array2[4] = {0,1,2,3};
int *pr = array1;  //非法
pr = array2;  	   //合法

但在进行两层间接运算时,这样的赋值将不再安全,如果允许这样赋值,可能会产生如下的问题:

例程:

void main( void )
{
    const int **pp2 = NULL;
    int *p1 = NULL;
    const int n = 13;
    pp2 = &p1;
    *pp2 = &n;
    *p1 = 10;
}

将 pp2、p1 和 n 初始化:

当pp2 = &p1时,*pp2 = p1 = 0x00000000。

然后再将*pp2 = &n,也就是将p1指向n。

再借由普通变量指针 p1 将常量 n 的值改变。

所以当运算达到一层以上时,普通类型的指针将不能赋给 const 类型的指针。

否则将有可能借由普通指针之手把常量值改变。

时间: 2024-11-10 00:03:43

例看const与指针兼容性的相关文章

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

结合示例说明C++中const和指针结合时怎么理解

在之前随笔<C++中const使用要点(一)>中简单叙述了const int*.int* const和const int* const的区别,记住三句话就能在实际运用时用对,但是看书时发现了指针常量.常量指针这些名词,发现明白这些概念对阅读文章时还是比较重要的. 关键:const和指针结合时代码从右往左看 1.常量指针(const pointer) 概念:常量是形容词,也就是说常量指针是一个指针,用const修饰的指针. 按照代码从右往左(概念名词从左往右)的阅读顺序,不妨试着写一下. Ste

C++中的const和指针组合

在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前,所以p指向的这个int变量对于*p来说是const的,即不能通过*p改变这个变量的值,但是变量本身可以随便改变自己的值.另外也可以改变p的指向. 例: int x=2; int y=3; const int *p=&x; *p=4;   //错误,不能通过*p改变变量的值 x=4;    //可以,

C/C++中的const和指针组合

在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前,所以p指向的这个int变量对于*p来说是const的,即不能通过*p改变这个变量的值,但是变量本身可以随便改变自己的值.另外也可以改变p的指向. 例: int x=2; int y=3; const int *p=&x; *p=4;   //错误,不能通过*p改变变量的值 x=4;    //可以,

const与指针的纠缠

当使用带有const的指针时其实有两种意思.一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容. 先说指向const的指针,它的意思是指针指向的内容是不能被修改的.它有两种写法.      const int* p; (推荐)       int const* p;      p是一个指针,它指向的内容是const int 类型.p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的. 再说const指针,它的意思是指针本身的值是不能被修改的.它只有一种写法  

const,指针与引用的关系

看完C++Primer第二章后,对于const,指针和引用以及后面的constexpr,auto之类的关系异常混乱,特此整理. 一.const必须初始化 const int i = 42; const int j = get_size(); 二.const 和 引用    1.常量引用(对常量的引用):将引用与一个常量对象绑定 const int ci = 42; const int &r1 = ci; 2.除此之外,允许一个常量引用绑定一个非常量的对象,字面值或表达式 int i = 42;

c 指针兼容性问题

指针兼容性问题: const指针不能赋值给非const指针. 非const指针可以赋值给const 指针,但前提是只是一层间接运算 1 Example: 2 int *pt1; 3 const *pt2; 4 const **pt3; 5 6 pt2=pt1;//OK 7 pt1=pt2;//NO 8 pt3=&pt2;//OK 9 pt3=&pt1;//NO double indirection 10 Problem: 11 pt1=pt2;//NO 12 pt3=&pt2;//

关于const修饰指针

const修饰指针,一般分为如下四种情况: int b = 500; const int *a = &b;   //情况1 int const *a = &b //        2 int* const a = &b //  3 const int* const a = &b//  4 如何区别呢?1)先看情况1.如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量:如果const位于星号的右侧,const就是修饰指针本身,即指针本身是

const型变量和const型指针

const型变量和const型指针 const型变量 如果在程序中需要经常使用某一常量,可以使用编译预处理命令定义符号常量. eg:#define PI 3.14159 const型变量也是一种定义常量的手段.const型变量是特殊的变量,程序运行过程中不可改变,其他特性和变量一样.定义const变量时必须初始化. eg: const int Max=1000; //int和const位置可以交换. const常量与符号常量的区别: 1)符号常量由预编译器处理,const型变量由变量处理. 2)