初学c语言,对《常量与约束》篇幅看完似懂非懂,实属难受。下面对该知识进行梳理:
指向常量的指针
用const约束指针对所指对象访问时,该指针就是指针向常量的指针
目的:约束所指对象的访问(所指对象值不能修改,指针可修改)
定义方式
- const 类型 *指针;
- 类型 const *指针;
代码例子
#include <stdio.h>
#include "iostream"
using namespace std;
int main() {
// >>>>>>>>>>>>>>> 指向常量的指针 >>>>>>>>>>>>>>>
int var = 35; // 变量
const int MAX = 1000; // 常量
int *p; // 普通指针
const int *p1_const; // 指向常量的指针
const int *p2_const; // 指向常量的指针
p1_const = &var; // 指向常量的指针 可以指向非常量(地址)
p2_const = &MAX; // 指向常量的指针 可以指向常量(地址)
cout << *p1_const << endl;
cout << *p2_const << endl;
// 错误演示:指向常量的指针 不可以修改对象,但能读取对象
// *p1_const = 100; // 指向常量的指针 指向的对象不修改
// *p2_const = 200; // 指向常量的指针 指向的对象不修改
// p=&MAX; // 指向常量的指针 不能赋给普通指针
// 可以读 指向常量的指针指向的对象
var = *p1_const + *p2_const;
cout << var << endl;
// <<<<<<<<<<<<<<< 指向常量的指针 <<<<<<<<<<<<<<<
}
指针常量
指针常量:指针变量的值,只能在定义的时候初始化,定义之后不能修改(即是不能改变指针变量的指向),但不影响所指对象的访问特性。
目的:约束指针变量的值,使指针变量为“只读”(指针指向不可改,对象可改)
定义方式
- 类型 *const 指针;
代码例子
#include <stdio.h>
#include "iostream"
using namespace std;
int main() {
// >>>>>>>>>>>>>>> 指针常量 >>>>>>>>>>>>>>>
// 语法:
// 类型 *const 指针;
// 说明:指针常量,仅仅约束指针值为只读,并没有约束间址访问对象(指针不可改,对象可改)
cout << "指针常量" << endl;
int var1 = 100, var2 = 200;
int *const const_P1 = &var1; // 定义指针常量时初始化,之后指针不能修改了
cout << *const_P1 << endl;
// const_P1 = &var2; // 错误:指针常量初始化之后指针就不能修改了
*const_P1 = var2; // 错误:指针常量初始化之后指针不能修改,但可以修改所指对象值
cout << *const_P1 << endl;
// 错误演示:const_P2是一个指针常量,仅仅约束指针值为只读,并没有约束间址访问对象(修改对象)
// const int MAX = 1000;
// int *const const_P2=&MAX;
// <<<<<<<<<<<<<<< 指针常量 <<<<<<<<<<<<<<<
}
指向常量的指针常量
指向常量的指针常量:指针本身和所指对象的值在定义之后都限制为只读,不能写。
目的:约束指针本身和所指对象的访问(指针和所指对象均可读不能写)
定义方式
- const 类型 *const 指针;
- 类型 const *const指针;
代码例子
#include <stdio.h>
#include "iostream"
using namespace std;
int main() {
// >>>>>>>>>>>>>>> 指向常量的指针常量 >>>>>>>>>>>>>>>
// 语法:
// 类型 const 类型 *const 指针;
// 类型 *const const 指针;
// 说明:指向常量的指针常量,指针本身和所指对象的值在定义之后都限制为只读,不能写(指针、对象均不可改)
int var=128,other_value=256; // 普通变量var、other_value
const int MAX=1000; // 常量MAX
const int *const double_P1=&var; // 定义指针常量double_P1
const int *const double_P2=&MAX; // 定义指针常量double_P2
// 错误演示
// double_P1 = &other_value; // 错误,不能写指针常量
// *double_P2 = 500; // 错误,不能写指向常量的指针常量
var = other_value; // 正确,不影响变量的读和写
// <<<<<<<<<<<<<<< 指针常量 <<<<<<<<<<<<<<<
return 1;
}