一起养成写作习惯!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情。
欢迎关注我的公众号 [极智视界],获取我的更多笔记分享
大家好,我是极智视界,本文讲解一下 常量指针与指针常量的用法。
常量指针不能用于改变它指向的值,指针常量在初始化后就不能改变。
1 常量指针
如果作为形参传入到函数中,其在函数内部是不能被修改的。
常量指针定义:又叫常指针(常量的指针),即这是个指向常量的指针,这个常量是指针的值(地址),而不是地址指向的值。
关键点:
- 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
- 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
- 指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址。
代码形式:
数据类型 const 指针变量;
const 数据类型 指针变量;
2 指针常量
指针常量定义:本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。
关键点:
- 它是个常量;
- 指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
- 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化。
- 使用前要初始化
代码形式:
数据类型* const 指针变量;
3 指向常量的常指针
指向常量的常指针定义:指向常量的指针常量就是一个常量,且它指向的对象也是一个常量。
关键点:
- 一个指针常量,指向的是一个指针对象;
- 它指向的指针对象且是一个常量,即它指向的对象不能变化。
代码形式:
const 数据类型* const 指针变量;
数据类型 const * const 指针变量;
4 示例
4.1 示例一
#include <iostream>
using namespace std;
int main() {
/// 常量指针
int a;
const int *p1 = &a;
a = 300;
//*p1 = 56; // 错误,*p1是const int的,不可修改,即常量指针不可修改其指向的内容
int b = 200;
p1 = &b; // 指针可以修改
/// 指针常量
int* const p2 = &a;
a = 500; // 可以通过原来的声明修改值
*p2 = 400; // 指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容是可以变化的
//p2 = &b; // 错误,因为p2是const指针,因此不能改变p2指向的地址
/// 指向常量的常量指针
const int* const p3 = &a;
//*p3=1; // 错误
//p3=&b; // 错误
a = 600; // 可以通过原来的声明修改值
}
4.2 示例二
#include <iostream>
using namespace std;
int main() {
int a = 3;
int b = 1;
int c = 2;
int const *p1 = &b;
int *const p2 = &c;
cout << "old vars and pointer's address: " << endl;
cout << "&a = " << &a << "a = " << a << endl;
cout << "&b = " << &b << "&c = " << &c << "b = " << b << "c = " << c << endl;
cout << "p1 = " << p1 << "p2 = " << p2 << "*p1 = " << *p1 << "*p2 = " << endl << endl;
p1 = &a;
b = 11;
cout <<"the address and values of const pointer: " << endl;
cout << "p1 = " << p1 << "*p1 = " << *p1 << endl << endl;
c = 22;
*p2 = c;
cout << "the address and values of const pointer: " << endl;
cout << "p2 = " << p2 <<"*p2 = " << *p2 << endl << endl;
return 0;
}
从输出结果可以看出,对于常量指针 p1,改变其地址指向,内容也随着地址的改变而变化了;对于指针常量 p2,初始化后地址就固定了,内容可以随时重新赋值。
对于常量指针 p1,可以改变它指向的地址,但不能改变指向的内容;对于对于指针常量 p2,可以改变它指向地址的内容,却不能改变它指向的地址。
4.3 示例三
#include <iostream>
#include <iomanip>
using namespace std;
const int SIZE = 6;
const double payRates[SIZE] = {18.55, 17.45, 12.85, 14.97, 10.35, 18.89};
const double PAY[SIZE] = {17.2, 11.4, 14.56, 39.12, 28.45, 55.77};
void displayPayRates(const double *rates, int size) {
cout << *rates << endl;
rates = PAY;
cout << *rates << endl;
cout << setprecision(2) << fixed << showpoint;
for(int count = 0; count < size; count++)
{
cout << rates + count << endl;
cout << "Pay rate for employee " << (count + 1) << " is $ " << *(rates + count) << endl; endl;
}
}
int main() {
cout <<"this is payRates's address " << &payRates << endl;
cout << "this is PAY's addtess " << &PAY << endl;
displayPayRates(payRates, SIZE);
}
以上 要注意三点:
- 作为固定形参的输入 const double *rates,其在 displayPayRates 函数内部不能被重新赋值,即不能出现类似于 rates[0] = 12.56 等这样的代码,但可以出现 rates = &PAY[SIZE] 和 rates = PAY 的代码;
- rates 最初表示 payRates 常量首地址,其每加 1 则地址向后移动 8 个字节,因为 double 类型占 8 个字节
- displayPayRates 函数的形参中一定要包含 const 关键字,否则会产生编译器报错。
好了,以上分享了 常量指针与指针常量的用法。希望我的分享能对你的学习有一点帮助。
【公众号传送】
今天的文章极智Coding | 讲一讲常量指针与指针常量分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/13658.html