指针常量&常量指针&指向常量的指针常量
搞不懂不吃晚饭
(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指针来改变实参的内容。
指针常量&常量指针&指向常量的指针常量的更多相关文章
- 【C语言】14-返回指针的函数与指向函数的指针
前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...
- 【C语言】-返回指针的函数与指向函数的指针
本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...
- C++ 指针的引用和指向引用的指针
指向引用的指针 简单使用指针的一个例子就是: int a = 1; int *p = &a; 预先强调: 没有指向引用的指针 原因: 因为引用 不是对象,没有地址. 但是指向引用的指针是什么形 ...
- 12-返回指针的函数&&指向函数的指针
前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针 一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...
- 《C++ Primer》之指向函数的指针
函数指针是指指向函数而非指向对象的指针.像其他指针一样,函数指针也指向某个特定的类型.函数类型由其返回类型以及形参表确定,而与函数名无关: // pf points to function retur ...
- 《征服 C 指针》摘录3:数组 与 指针
一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...
- 《征服 C 指针》摘录4:函数 与 指针
一.指向函数的指针 函数名可以在表达式中被解读成“指向函数的指针”,因此,正如代码清单 2-2 的实验那样,写成 func 就可以取得指向函数的指针. “指向函数的指针”本质上也是指针(地址),所以可 ...
- 指向const的指针和const指针
1.指向const的指针:const int *p 或 int const *p 解释:p是一个指针,指向const int类型的常量:指针指向的内容为常量,因此不能改变*p的值,但指针p可以改变,指 ...
- const 指针与指向const的指针
最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...
- C++(二十四) — 指向字符的指针为什么可以用字符串来初始化,而不是字符地址?
一.C语言中,为什么字符串可以赋值给字符指针变量? char *p: a='; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值?? 问:一直 ...
随机推荐
- Redis 的完整安装过程
Windos 版本安装 Redis 官方并不支持 Window 版本,但是微软公司在 Github 上维护了一个 Windows 版本的 Redis 项目,供 Windows 用户下载使用. 下载地址 ...
- 在Jenkins容器中安装docker-compose
首先使用Docker容器安装Jenkins 链接参考 安装成功后使用管理员权限进入到Jenkins容器 docker exec -it -u root jenkins bash 下载docker-co ...
- python与嵌入式的火花
一.前言 近些年来python非常流行,Python是一种面向对象的解释性计算机程序设计语言,Python语法简介清晰,易读性以及可扩展性,Python具有丰富和强大的库,能够把用其他语言制作的各种模 ...
- 【思维】UVA 11300 Spreading the Wealth
题目大意 vjudge链接 有n个人围圆桌而坐,每个人有Ai个金币,每个人可以给左右相邻的人一些金币. 若使得最终所有人金币数相等,求最小金币转移数. 数据范围 n<1000001 样例输入 3 ...
- 飞翔---------双重线性dp
题目: 鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧.于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中. 这些鹰的起始点被设在一个N*M矩阵的左下 ...
- go 实现websocket推送
index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- nginx安全: 配置http基本验证(Basic Auth)(nginx 1.18.0)
一,http基本验证的作用: 1,http基本身份验证会从浏览器弹出登录窗口, 简单明了,容易理解, 对于面向终端用户的前台来说,不够友好, 但对于内部员工操作的后台还是很有用,通常作为一层安全措施应 ...
- ansible用authorized_key模块批量推送密钥到受控主机(免密登录)(ansible2.9.5)
一,ansible的authorized_key模块的用途 用来配置密钥实现免密登录: ansible所在的主控机生成密钥后,如何把公钥上传到受控端? 当然可以用ssh-copy-id命令逐台手动处理 ...
- nginx 快速安装
必要条件 1能访问外网 2防火墙放开80 3有软件安装权限 依次执行以下命令 一.设置CentOS7的yum源及EPEL yum源 wget -O /etc/yum.repos.d/epel.repo ...
- 五分钟详解MySQL并发控制及事务原理
在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...