网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 149|回复: 0
打印 上一主题 下一主题

【C语言】指针常量和常量指针的区别

[复制链接]

686

主题

693

帖子

3101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3101
跳转到指定楼层
楼主
发表于 6 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wander 于 2024-12-16 21:18 编辑

      在C语言中,指针常量常量指针是两个容易混淆的概念,它们虽然看起来相似,但实际上有着很大的区别。
     指针常量(Pointer Constant)是说指针本身是一个常量,它所存储的地址值不能改变。这意味着,一旦我们初始化了一个指针常量,就不能再改变它的指向。然而,我们可以通过这个指针来修改它所指向的内容(也就是它所指向的内存位置中的值)。换句话说,指针是固定的,但指针指向的内容是可变的。
常量指针(Constant Pointer)则是指向常量的指针。这意味着指针可以指向不同的内容(也就是它所指向的内存位置中的值),但是不能通过这个指针来修改内容。也就是说,指针本身可以改变,可以指向不同的内容,但是它所指向的内容是不可修改的。
为了更好地理解这两个概念,我们来看一下它们的语法格式和一些示例代码:

指针常量的语法格式:
数据类型 * const 指针名 = &变量名;  //声明以后必须立即初始化

常量指针的语法格式:
const 数据类型 * 指针名;
数据类型 const * 指针名;

它们的语法格式类似,只是 const 的位置不同。const 离谁近,就用来修饰谁,谁的值就不能改变。
· 对于指针常量,const 用来修饰指针本身,所以指针本身的值不能改变;但是 const 没有修饰指针所指向的内容,所以内容是可以改变的。
· 对于常量指针,const 用来修饰指针所指向的内容,所以内容不能改变;但是 const 没有修饰指针本身,所以指针的指向可以改变。

现在,让我们通过一些具体的代码示例来展示这两种指针的使用和区别:
1. #include <stdio.h>
2. int main() {
3.     int x = 10, y = 20;
4.     // 指针常量
5.     int * const ptr1 = &x;
6.     *ptr1 = 30;  // 合法,可以修改指针指向的值
7.     // ptr1 = &y;  // 非法,不能修改指针本身的值(指向的地址)
8.     
9.     // 常量指针
10.    const int *ptr2 = &x;
11.    ptr2 = &y;  // 合法,可以修改指针指向的地址
12.    // *ptr2 = 40;  // 非法,不能通过指针修改指向的值
13.   
14.    printf("x = %d, y = %d\n", x, y);
15.    printf("*ptr1 = %d, *ptr2 = %d\n", *ptr1, *ptr2);
16.   
17.    return 0;
18.}
输出结果:
x = 30, y = 20
*ptr1 = 30, *ptr2 = 20

在上面的示例中,我们定义了一个指针常量 ptr1 和一个常量指针 ptr2。ptr1始终指向变量 x,我们可以通过 ptr1 修改 x 的值,但不能让 ptr1 指向其他变量。相反,ptr2 可以改变它所指向的地址(从指向 x 变为指向 y),但我们不能通过 ptr2 来修改它所指向的值。
理解这两种指针的区别对于编写安全和高效的 C 程序非常重要。指针常量通常用于确保指针始终指向特定的内存位置,而常量指针则用于保护数据不被意外修改。
值得注意的是,我们还可以将这两种概念结合起来,创建一个指向常量的常量指针:
const int * const ptr = &x;

在这种情况下,ptr 既不能指向其他地址,也不能用来修改它所指向的值。这种组合提供了最严格的限制,确保了指针和它所指向的内容都不会被修改。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-22 01:12 , Processed in 0.034869 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表