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

用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. 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析

    1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...

  2. iptables阻止服务器被攻击

    下列规则将会阻止来自某一特定IP范围内的数据包,因为该IP地址范围被管理员怀疑有大量恶意攻击者在活动:  # iptables -t filter -A INPUT -s 123.456.789.0/ ...

  3. WebBasic-表单

    用来提交数据 <form></form> 属性:action:提交的url  method:表单数据提交的方式  enctype:表单数据的编码方式 表单控件 --input元 ...

  4. JDBC使用sql语句

    JDBC---连接数据库 java与数据库连接需要驱动,这个驱动则是JDBC,连接的时候需要ip+端口号+dbname 还要用户名和密码 改java文件的编码方式--在项目名点右键属性----把编码方 ...

  5. @NotNull丶@NotBlank丶@NotEmpty

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

  6. Axure自动幻灯片制作

    1.打开axure7,开始. 2.拖一个占位符组件到布局上(当然也可以是矩形.图片之类的),大小270*170,作为幻灯片的第一张片子,双击写上“第一张片子”. 3.拖一个矩形,设置形状为椭圆,调整大 ...

  7. cxf所用的lib

    cxf_lib

  8. mysql主从复制错误:Last_SQL_Error: Error 'Duplicate entry '327' for key 'PRIMARY'' on query. Default database: 'xxx'. Query: 'insert into

    这个算不算解决,我都不太清楚,因为我感觉网上的说法,只是把错误忽略了,不表示以后用从库时不会出问题!!! 解决的办法是在从库上执行: mysql> slave stop; mysql> s ...

  9. Intent携带额外的数据的方法

    1.putExtras(Bundle data):向Intent中放入需要“携带”的数据.2.putXxx(String key,Xxx data):向Bundle放入Int.Long等各种类型的数据 ...

  10. Linux sar使用

    [root@ywcrmdb ~]# sar -d 1 10 Linux 2.6.32-220.el6.x86_64 (ywcrmdb)  2014年04月19日  _x86_64_ (4 CPU) 1 ...