这种例子在我们平时编程时可能会很少用,但是在面试时被问的可能性就很大了。

用const修饰指针,常见的情况可以分为四种:

1.const int *p; // p 可变,p 指向的对象不可变
2.int const *p; // p 可变,p 指向的对象不可变
3.int *const p; // p 不可变,p 指向的对象可变
4.const int *const p; //指针p 和p 指向的对象都不可变

      可以看到,这四种情况面对的问题是p的值和p指向的值是否可以修改。

下面,我给出一个例子,在例子中已经给出了详细的注释:

#include <iostream>
using namespace std; int main(void)
{
//给出两个值用于测试
int testValue1 = 10;
int testValue2 = 15; //这个代表 p 的值可以改变, *p 的值不能改变
const int *p = &testValue1; p = &testValue2; //可以给 p 赋其他的地址
//*p += 1; //错误,*p 的值不能改变 //和 const int *p 是一个意思
int const *p2 = &testValue1;
p2 = &testValue2; //这个代表 p3 指向的地址是不能改变的,但是 *p3 是可以改变的
int *const p3 = &testValue1;
//p3 = &testValue2; //错误,地址不能改变
*p3 += 1; //这个代表 p4 指向的地址不能改变,且那个值也不能改变
const int *const p4 = &testValue1;
}

这下是不是明白了很多,但是,这样不好记啊,好吧,我现在讲下应该怎么去记下这些东西。

      其实,我们需要做的并不是刻意记住每一种写法代表的是什么,这样太累了,我们需要做的是好好观察:

     这里,观察的方式是“就近原则”,是观察 const 和谁的位置比较近,因为 const 修饰的不能改变的变量,所以,离 const 近,那么它就是不可改变的变量。

      

       1.const int *p; // p 可变,p 指向的对象不可变

这里,const 和 *p 最近 ,所以,*p 就是不可改变的,也就是值是不可改变的,p 的地址是可以改变的。

      2.int const *p; // p 可变,p 指向的对象不可变

这里,const 还是和 *p 最近,所以,是和第一种情况是一样的。

3.int *const p; // p 不可变,p 指向的对象可变

这里,const 和 p 最近,所以,情况就改变了,正好和前两种情况相反,p 的地址是不能改变的,而p 指向的对象是可以变的。

4.const int *const p; //指针p 和p 指向的对象都不可变

这下就简单的,const和 *p 和 p 都是最近的,所以,这两个都是不能改变的。

说完了这些,是不是对const修饰指针很明白了!

C语言--const修饰指针解析的更多相关文章

  1. const修饰指针

    关于const修饰指针的情况,一般分为如下4种情况: ; const int *a =&b; //情况1 int const *a =&b; //情况2 int* const a =& ...

  2. const修饰指针+volatile +restrict

    const这块的难点 const修饰指针有以下的几种形式 ,不同的形式 它的意义不一样. 形式1: int a=23: const int *p=&a: a是int型,&a是int * ...

  3. 关于const修饰指针

    const修饰指针,一般分为如下四种情况: int b = 500; const int *a = &b;   //情况1 int const *a = &b //        2 ...

  4. C++ --const修饰指针

    const修饰指针 1.const修饰指针 (常量指针)常量的指针 const int *p = &a; const修饰的是*p(表示内容为常量),不是p(指针) 指针指向的地址可以改,但指针 ...

  5. C++中使用const修饰指针

    在本文中呢,主要讲解四个方面,即:常量数据的与否和常量指针的与否中const如何对指针进行修饰: 1.指向非常量数据的常量指针 对于一个指向非常量数据的常量指针,我们应该清楚的知道,在这我们注重的是指 ...

  6. const修饰指针的三种效果

    当用const进行修饰时,根据const位置的不同有三种不同效果. 判断的标准是:const修饰谁,谁的内容就是不可变的. 1 const int *p = &a; const修饰*p, *p ...

  7. C语言 const与指针

    //const与指针 #include<stdio.h> #include<stdlib.h> void main(){ ; ; const int *p; p = & ...

  8. const修饰指针时应注意的问题

    1.指向常量的指针 顾名思义,一个指针指向const对象,则称它为指向常量的指针. ; int* ptr=&a; //错误 const int* ptr=&a; //必须用const来 ...

  9. C++中const修饰基本数据类型、指针、引用、对象

    const修饰基本数据类型 #include <iostream> using namespace std; void main(){ const int a = 1; const cha ...

随机推荐

  1. URI、URL、URN

    URI.URL.URN URI(Uniform Resource Identifie):统一资源标识符 URL(Uniform Resource Locator):统一资源定位符 URN(Unifor ...

  2. Sqlserver数据库日志太大如何快速删除

    sqlserver使用在windows系统中,如果文件超上百GB了,我们还直接删除不了,这个问题我以前的apache日志就碰到过,至今还没删除呢,那么Sqlserver数据库日志太大如何快速删除呢,有 ...

  3. .net面试总结

    一. hr 为人处事 工作中遇到问题:沟通很重要 离职原因:公司倒闭 二. ISAPI Internet Server Application Program Interface 三. http状态码 ...

  4. myeclipse 8.5打开文件Could not open the editor: Invalid thread access 异常

    最近打开了一个好久没用的myeclipse 8.5下的工作区间,导入一个项目,想打开文件编辑提示Could not open the editor: Invalid thread access

  5. 解决Access restriction问题

    今天在导入一个包时报错了

  6. 狗狗40题~(Volume A)

    A - The Willy Memorial Program 大模拟题…… 一开始的思路不对,修修补补WA了十发.当时想直接一个并查集做连通来搞定它,结果发现不能很好地判断各管的水位.究其原因还是因为 ...

  7. Android应用开发中关于this.context=context的理解

    在Android应用开发中,有的类里面需要声明一个Context的成员变量,然后还需要在该类的构造函数中加上this.context=context;这行代码.为什么要这么写呢?不写不行么? 先看下面 ...

  8. 详解CSS选择器、优先级与匹配原理

    原文链接:http://polaris1119.javaeye.com/blog/764428 作为一个Web开发者,掌握必要的前台技术也是很重要的,特别是在遇到一些实际问题的时候.这里给大家列举一个 ...

  9. C++是怎么实现多态性的

    C++是怎么实现多态性的,C++中多态实现的原理, 当一个类中有虚函数时,系统会为该类构造一个虚函数表vtable,他是一个指针数组,存放每个虚函数的入口地址,编译器还会在此类中隐含插入一个指针vpt ...

  10. Valve开源了Direct3D到OpenGL的转译层,方便开发者迁移游戏到Linux(面向游戏玩家的六款最佳 Linux 发行版)

    Valve开源了Direct3D到OpenGL的转译层,方便开发者迁移游戏到Linux:https://github.com/ValveSoftware/ToGL Valve SteamBox主机系统 ...