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

用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. PHP Sessions

    PHP Sessions PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中 ...

  2. intent.setFlags方法中参数值的含义

    intent.setFlags()方法中参数的含义 1.FLAG_ACTIVITY_NEW_TASK: 例如现在栈一的情况是:A    B   C(C位于栈顶),C通过intent跳转到D,并且这个I ...

  3. SSM框架搭建java.lang.ClassNotFoundException: org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

    在搭建 spring springMVC Mybatis 时候出错 将org.springframework.http.converter.json.MappingJacksonHttpMessage ...

  4. Python实现类似switch...case功能

    最近在使用Python单元测试框架构思自动化测试,在不段的重构与修改中,发现了大量的if...else之类的语法,有没有什么好的方式使Python具有C/C#/JAVA等的switch功能呢? 在不断 ...

  5. 编译TWRP-recovery教程及源码地址

    TWRP这个是一个老外的开源项目,全称Team-Win-Recovery-Project Source:https://github.com/TeamWin/Team-Win-Recovery-Pro ...

  6. Reaver v1.4 用法整理 含高级参数说明 pin必备资料

    闲话少叙 使用方法: airmon-ng start wlan0 //启动mon0监控 reaver -i mon0 -b MAC -a -S -vv //普通用法 如果,90.9%进程后死机或停机, ...

  7. 解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一

    转载请注明出处: http://www.goteny.com/articles/2013/11/8.html http://www.cnblogs.com/zjjne/p/3428480.html 当 ...

  8. 从汇编来看c语言之指针

    一.基础研究 将下面的程序编译连接,用debug加载: 首先执行第一条语句: 发现p=(unsigned char *)0x1000;在这里是把1000赋给一个偏移地址为01af.大小为两字节的内存空 ...

  9. synaptics驱动,插入USB鼠标禁用触控板注册表

    Title:synaptics驱动,插入USB鼠标禁用触控板注册表 --2010-11-01 22:21 记得以前用过一个synaptics的驱动,自带有插入USB鼠标禁用触控板的选项的,有些没有自带 ...

  10. poj 1819 Disks

    http://poj.org/problem?id=1819 #include <cstdio> #include <cstring> #include <cmath&g ...