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

用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 方向的一个合格的架构师

    突然看到这篇文章, 值得反省, 乐在其中, 在接下来的发展中不被淘汰的都来看看, 如何成为一个架构师先明确这里所指的PHP工程师,是指主要以PHP进行Web系统的开发,没有使用其的语言工作过.工作经验 ...

  2. android之GridView实现九宫格布局

    效果图: 代码如下: MyGridView.java /** * 自定义GridView 解决在scrollview中只显示第一行数据的问题 * Created by Spring on 2015/1 ...

  3. SQL从入门到基础 - 02 SQLServer的使用

    一.SQLServer的管理 服务器名称:ICECOA-81DEA7A2.\SQLEXPRESS 1. 数据库->表->字段->主键 2. 编辑表 二.数据类型 1. bit:相当于 ...

  4. pragram once

    #pragma once   [1]#pragma once这个宏有什么作用? 为了避免同一个文件被include多次,C/C++中有两种宏实现方式:一种是#ifndef方式,一种是#pragma o ...

  5. Android 用ListView实现GridView分列显示

    我想实现百度影音首页的这种效果: 在网上用ScrollView+GridView可以实现,但是touch scrollview的时候会莫名刷新gridview,这样用户体验很不好,而且感觉百度不是这样 ...

  6. thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类

    本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类 ...

  7. thinkphp 开发的获取用户信息

    <?php namespace Home\Controller; use Think\Controller; use Com\Wechat; use Com\WechatAuth; class ...

  8. jQuery版本引发的血案 iframe error 和 checkbox 无法勾选

    问题介绍: 1.由于我们的项目里面用了很多Iframe,在初始话加载的时候页面就会报错.一开始调试很久没找到什么原因,看打印结果页面会被两次load,只能一步步找, 最后发现在document rea ...

  9. 0X0000124

     求教卡饭网友,都快疯掉了.      最近搞设计,电脑频发出现蓝屏,今晚都出现三次了,新装的win7 64位系统,都是安装的原版光驱.     错误代码基本上都是:0x00000124 (0x000 ...

  10. 使用C#版本GDAL读取复数图像

    GDAL的C#版本虽然在很多算法接口没有导出,但是在读写数据中的接口基本上都是完全导出了.使用ReadRaster和WriteRaster方法来进行读写,同时对这两个方法进行了重载,对于常用的数据类型 ...