亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

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;

语法说明:

指向常量的常量指针示例

此例声明指向常量的常量指针 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语言

  1. C 语言位运算符精通:与、或、异或、移位、取反全解析
  2. 掌握 C 语言结构体柔性数组成员实现动态数据处理
  3. 掌握 C++ 信号处理:安全中断管理与优雅程序终止
  4. C 语言运算符完全指南:算术、关系、逻辑、位运算等
  5. 精通 C# Queue:Enqueue、Dequeue 与先进先出操作全解析
  6. 掌握 C# sealed 类与方法:用法、示例与代码安全性能提升
  7. C 语言关键字与标识符完全指南
  8. C 语言指针实战:从入门到高级编程
  9. C++数据类型修饰符详解:signed/unsigned/long/short实战指南
  10. C++ 流精通:cout、cin、cerr、clog 实战指南
  11. 理解 C 语言作用域规则:局部、全局与形式变量
  12. C 语言 malloc() 完全指南:语法、实战案例与最佳实践