C 语言常量指针与指向常量的指针深度解析
在 C 语言中,指针是存储另一变量内存地址的变量,const 关键字用于定义初始化后值不可更改的变量或指针。将 指针 与 const 关键字结合,可控制两件事:
- 指针存储的地址能否改变。
- 该地址存储的值能否改变。
本章将介绍常量指针的三种主要变体:
- 常量指针
- 指向常量的指针
- 指向常量的常量指针
常量指针
常量指针意味着指针本身是常量。一旦初始化指向某内存位置,就不能指向其他位置,但该位置存储的值仍可更改。
以下是 常量指针语法:
data_type *const pointer_name = &variable;
此语法中,data_type 是指针指向的数据类型,*const 使指针本身成为常量,pointer_name 是指针名,&variable 赋予变量的内存地址。
常量指针示例
此例声明常量指针 ptr 并用变量 x 的地址初始化。然后通过 ptr 修改 x 的值并打印。
#include <stdio.h>
int main() {
int x = 10;
int y = 20;
int *const ptr = &x; // 指向 int 的常量指针
printf("Value of x: %d\n", *ptr);
*ptr = 15; // 可修改地址处的值
printf("Modified value of x: %d\n", *ptr);
// ptr = &y; // 改变指针地址不允许
return 0;
}
下面是程序 输出,显示指针固定指向 x,但 x 的值可更新。
Value of x: 10
Modified value of x: 15
常量指针错误示例
此例声明常量指针 ptr 并用变量 x 地址初始化。然后尝试让它指向变量 y 的地址。这将导致 错误,因为常量指针初始化后不能指向其他内存位置。
#include <stdio.h>
int main() {
int x = 10;
int y = 20;
int *const ptr = &x; // 指向 int 的常量指针
printf("Value of x: %d\n", *ptr);
// 尝试改变指针指向 y
ptr = &y; // 不能改变常量指针的地址
return 0;
}
可见下面的 错误,表明不能改变常量指针的地址。
error: assignment of read-only variable 'ptr'
指向常量的指针
指向常量的指针意味着它指向的值不能更改,但指针本身可指向不同内存地址(或变量)。
以下是 指向常量的指针语法:
const data_type *pointer_name = &variable;
data_type const *pointer = &variable;
此语法中,const data_type 或 data_type const 表示指针指向常量值,pointer_name 是指针名,&variable 赋予变量地址。
指向常量的指针示例
此例声明指向常量值的指针 ptr 并赋予变量 a 的地址。然后让指针指向变量 b 的不同地址并打印其值。
#include <stdio.h>
int main() {
int a = 5;
int b = 30;
const int *ptr = &a; // 指向常量 int 的指针
printf("Value of a: %d\n", *ptr);
// *ptr = 10; // 不能通过指针修改值
ptr = &b; // 改变指针地址
printf("Now pointing to b: %d\n", *ptr);
return 0;
}
上述程序 输出,显示同一指针指向不同变量。
Value of a: 5
Now pointing to b: 30
指向常量的指针错误示例
此例声明指向常量的指针 ptr 并用变量 a 地址初始化。然后尝试通过指针改变 a 的值。这将导致 错误,因为指向常量的指针不允许修改其指向的值。
#include <stdio.h>
int main() {
int a = 5;
const int *ptr = &a; // 指向常量 int 的指针
printf("Value of a: %d\n", *ptr);
// 不能通过指向常量的指针修改值
*ptr = 10;
return 0;
}
下面可见 输出,显示 错误,表明不能通过指向常量的指针修改值。
error: assignment of read-only location '*ptr'
指向常量的常量指针
指向常量的常量指针是指针不能改变其内存地址,且该内存地址存储的值也不能改变。两种操作都受限,只能读取值。
以下是 指向常量的常量指针语法:
const data_type *const pointer_name = &variable;
语法说明:
- const data_type 表示内存位置的值不能通过指针更改。
- *const pointer_name 表示指针初始化后不能指向其他内存地址。
- &variable 将指针赋予变量的内存地址。
指向常量的常量指针示例
此例声明指向常量的常量指针 ptr 并赋予变量 a 的内存地址。然后用指针打印 a 的值。
#include <stdio.h>
int main() {
int a = 10;
const int *const ptr = &a; // 指向常量的常量指针
printf("Value of a: %d\n", *ptr);
// *ptr = 15; // 不能修改值
// ptr = &b; // 不能改变指针位置
return 0;
}
上述程序 输出:
Value of a: 10
指向常量的常量指针错误示例
此例声明指向常量的常量指针 ptr 并用变量 a 初始化。然后尝试通过指针修改值、让指针指向另一变量。两种操作都不允许,导致 编译错误。
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
const int *const ptr = &a; // 指向常量的常量指针
printf("Value of a: %d\n", *ptr);
// *ptr = 15; // 不能修改值
// ptr = &b; // 不能改变指针地址
return 0;
}
下面可见显示错误的 输出:
Value of a: 10
常量指针类型差异对比
下表展示 常量指针、指向常量的指针、指向常量的常量指针 的 区别。
| 变体 | 定义 | 可改地址? | 可改值? | 语法示例 |
|---|---|---|---|---|
| 常量指针 | 地址固定,但该地址处的值可修改 | 否 | 是 | int *const p = &x; |
| 指向常量的指针 | 可指向不同地址,但不能修改指向位置的值 | 是 | 否 | const int *p = &x; |
| 指向常量的常量指针 | 地址固定,且该地址处的值不可修改 | 否 | 否 | const int *const p = &x; |
总结
本章介绍了 C 语言常量指针和指向常量的指针。常量指针固定地址但允许改值,指向常量的指针允许改地址但不允许改值,指向常量的常量指针两者皆限制。
C语言
- C 语言位运算符精通:与、或、异或、移位、取反全解析
- 掌握 C 语言结构体柔性数组成员实现动态数据处理
- 掌握 C++ 信号处理:安全中断管理与优雅程序终止
- C 语言运算符完全指南:算术、关系、逻辑、位运算等
- 精通 C# Queue:Enqueue、Dequeue 与先进先出操作全解析
- 掌握 C# sealed 类与方法:用法、示例与代码安全性能提升
- C 语言关键字与标识符完全指南
- C 语言指针实战:从入门到高级编程
- C++数据类型修饰符详解:signed/unsigned/long/short实战指南
- C++ 流精通:cout、cin、cerr、clog 实战指南
- 理解 C 语言作用域规则:局部、全局与形式变量
- C 语言 malloc() 完全指南:语法、实战案例与最佳实践