搞不懂不吃晚饭

(1)指针常量

指针常量是一个常量,但是是指针修饰的。

格式:int * const p;

例如

int a, b;
int * const p = &a;//指针常量
//分为以下两种操作
*p = 9;//操作成功
p = &b;//操作错误,指针p将一直指向a,不能再指向b

因为声明了指针常量,p代表一个指针地址,因此指针变量不允许被修改,但是指针所指向的值即*p是可以修改的。如同次指针指向一个地址,该地址不能被修改,但是地址里的内容可以被修改。

(2)常量指针

如果在定义指针变量的时候,数据类型前用const修饰,被定义的指针变量就是指向常量的指针变量,指向常量的指针变量称为常量指针。

格式:const int *p = &a;

例如

int a, b;
const int *p = &a;//常量指针
//那么分为以下两种操作
*p = 9;//操作错误,指针指向的值不能改变
p = &b;//操作成功

因为常量指针的本质是指针,指针所指向的对象的值*p不能更改,但是指针,即p是可以修改的。

小结:

A、关键要看const修饰的是谁

int const 和 const int的写法是一样的

B、指针的话看const离谁近,离谁近就修饰谁

int a = 9;
int b = 5;
const int *p = &a; p = &b;//指针修改后,指针指向的值也修改

常量指针不能用于改变它指向的值;而指针常量在初始化后就不能改变。

常量指针

有时需要将const项目的地址传递给指针,在这种情况下,必须把指针定义为指向const项的指针。

const int SIZE = 6;
const double payRates[SIZE] = {18.55,17,45,12,85,14,97,10,35,18.98};

上述代码中,payRates是一个const double的数组,这意味着数组中每个元素都是一个const double,编译器不会允许程序员编写改变数组内容的代码,如果想要将payRates数组传递到一个指针形参中,那么这个形参必须声明为一个指向const double的指针,定义一个常量指针:const double *rates,rates形参被定义为一个指向const double的指针,const这个单词适用于rates指向的东西,而不是rates本身。

rates是一个指向const的指针,所以编译器不会允许程序员改变rates指向的内容,在将常量的地址传递到指针变量中时,改变量必须已定义为指向常量的指针。如果在rates形参的定义中没有使用const关键字,则会产生编译错误。

指针常量

指向const的指针指向一个常量项目,指针指向的数据不能改变,但是指针本身可以改变,因此是指向常量的指针变量。

而对于指针常量,const指针本身就是常量,一旦指针使用了某个地址进行初始化,那么他就不能指向除此地址之外的任何其他东西。

int value = 22;
int *const ptr = &value; 

在该代码中,ptr是用value变量的地址初始化的,因为ptr是一个指针常量,所以如果编写ptr指向其他任何内容的代码,都会导致编译器错误,但是如果使用ptr来改变value的内容,则不会产生错误,因为value不是常量,并且ptr也不是一个指向常量的指针。

指针常量必须使用起始值进行初始化,如果将一个指针常量用作函数形参,则该形参将使用传递进来的实参地址进行初始化,并且在函数执行时不能被修改为指向任何其他地方。以下就是一个试图违反这个规则的实例:

void setToZero(int *const ptr){
ptr = 0;//错误,不能更改ptr的内容
}

这个函数的形参ptr是一个const指针,他不会被编译,因为在函数中不能有改变ptr内容的代码,但是ptr并不指向const,所以可以使用代码来改变ptr指向的数据。以下实例完全可以编译:

void setToZero(int *const ptr){
*ptr = 0;
}

虽然该形参是指针常量,但是程序员可以使用不同的实参多次调用函数,以下的代码可以成功将x、y、z的地址传递给setToZero函数:

int x,y,z;
setToZero(&x);
setToZero(&y);
setToZero(&z);

指向常量的指针常量

int value;
const int *const ptr = &value;

以上代码中,ptr是一个指向const int的const指针。

ptr是用value的地址初始化的,因为ptr是一个指针常量,所以不能编写使ptr指向其他任何东西的代码,又因为ptr是一个常量指针,所以也不能用它来改变value的任何内容。

以下代码显示了一个指向常量的指针常量的另一实例:

void displayValues(const int *const numbers, int size){
for(int count = 0;count < size;count++){
cout << *(numbers + count) << " ";
}
cout << endl;
}

在这段代码中,形参numbers是一个指向const int的const指针,虽然可以使用不同的实参来调用函数,但是函数本身不能改变numbers指针的指向,也不能使用numbers指针来改变实参的内容。

指针常量&常量指针&指向常量的指针常量的更多相关文章

  1. 【C语言】14-返回指针的函数与指向函数的指针

    前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...

  2. 【C语言】-返回指针的函数与指向函数的指针

    本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...

  3. C++ 指针的引用和指向引用的指针

    指向引用的指针 简单使用指针的一个例子就是: int a = 1; int *p = &a; 预先强调: 没有指向引用的指针 原因: 因为引用 不是对象,没有地址. 但是指向引用的指针是什么形 ...

  4. 12-返回指针的函数&&指向函数的指针

    前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针   一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...

  5. 《C++ Primer》之指向函数的指针

    函数指针是指指向函数而非指向对象的指针.像其他指针一样,函数指针也指向某个特定的类型.函数类型由其返回类型以及形参表确定,而与函数名无关: // pf points to function retur ...

  6. 《征服 C 指针》摘录3:数组 与 指针

    一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...

  7. 《征服 C 指针》摘录4:函数 与 指针

    一.指向函数的指针 函数名可以在表达式中被解读成“指向函数的指针”,因此,正如代码清单 2-2 的实验那样,写成 func 就可以取得指向函数的指针. “指向函数的指针”本质上也是指针(地址),所以可 ...

  8. 指向const的指针和const指针

    1.指向const的指针:const int *p 或 int const *p 解释:p是一个指针,指向const int类型的常量:指针指向的内容为常量,因此不能改变*p的值,但指针p可以改变,指 ...

  9. const 指针与指向const的指针

    最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...

  10. C++(二十四) — 指向字符的指针为什么可以用字符串来初始化,而不是字符地址?

    一.C语言中,为什么字符串可以赋值给字符指针变量? char *p: a='; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值?? 问:一直 ...

随机推荐

  1. Python+Appium自动化测试(14)-yaml配置Desired capabilities

    一,前言 在之前的appium自动化测试示例中,我们都是把构造driver实例对象的数据(即Desired Capabilities)写在业务代码里,如下: # -*- coding:utf-8 -* ...

  2. antd pro 路由

    概要 antd pro 路由简介 路由, 菜单和面包屑 页面之间的路由 带参数的路由 总结 概要 路由配置是单页应用的核心之一, antd pro 将所有的路由配置集中在一个文件中, 可以更好的对应用 ...

  3. Linux系统的一些问题

    1.操作系统提供的服务: - 进程调度 - 内存管理 - 磁盘管理 - 网络服务 - 设备管理 - 提供应用程序编程接口 2.shell是什么? shell是一种具有特殊用途的程序,主要用于读取用户输 ...

  4. Eclipse4.5 Mars版本安装activiti插件 亲测可用

    Eclipse4.5 Mars版本安装activiti插件 亲测可用 学习使用activiti 在线安装一直,国内的网络真心的是 很苦 啊:在茫茫网络上面找到了很多插件的离线包 终于找到一个可以使用的 ...

  5. Java工程师应该掌握的知识,按重要程度排出六个阶段如下

      第一阶段:计算机组成原理.数据结构和算法.网络通信原理.操作系统原理: 第二阶段:Java基础.JVM内存模型和GC算法.JVM性能调优.JDK工具.设计模式: 第三阶段:Spring系列.Myb ...

  6. MeteoInfo脚本示例:GrADS to netCDF

    这里给出一个将GrADS数据文件转为netCDF数据文件的脚本示例程序,其它格式数据转netCDF可以参考: #-------------------------------------------- ...

  7. json对象去重,根据指定字段

    function FilterByName(data, Name) { //data是json对象,Name是根据什么字段去重 var map = {}, dest = []; for (var i ...

  8. docker启动服务---------------redis

    1. docker拉取镜像 docker pull redis 2 建立配置目录和准备配置文件 mkdir -p /usr/local/docker-redis && cd /usr/ ...

  9. docker将镜像推送到阿里云

    1.背景 在实际生产中我们会经常把镜像推送到云端仓库......... 下面看具体操作 第一步:登录阿里云创建仓库 第二步:在docker上登录阿里云仓库 第三步:推送镜像到阿里云 第四步:在公网上查 ...

  10. centos8平台安装zookeeper3.6集群

    一,规划三台zk服务器构成集群 ip:172.18.1.1 机器名:zk1 对应myid: 1 ip:172.18.1.2 机器名:zk2 对应myid: 2 ip:172.18.1.3 机器名:zk ...