c语言指向常量的指针和常量指针

本文详细解释了常量指针的概念,指出虽然指针本身不是常量,但其指向的值为常量时,不能修改地址。通过实例演示了如何正确操作常量指针并强调了其与普通指针的区别。同时介绍了常量指针在MPLS网络中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

指向常量的指针:该指针指向的值不能改变,指针不是常量,所以可以修改指针的指向 
int main(void){    int value = 10;    /*定义一个指向常量的指针*/    const int *pValue = &value;    //pValue = &value;    /**     *      * 编译器会报错,*pValue是只读的。     * 也就是指针指向的值不能改变     */          /**         * 这个赋值编译器会报错 assignment of read-only location '*pValue'         * 因为*pValue指向的值是常量,所以不能改变。         */    *pValue = 20;    /*但可以对value的值进行改变*/    int number = 30;    /**     * 指针不是常量,所以可以修改指针的指向     */    pValue = &number;    return 0;}常量指针 
#include <stdio.h> 
/** 
常量指针指针中存储的地址不能改变 
MPLS 虚拟专用网构建于IP承载A网基础之上,主要采用多协议标记交换(MPLS)方式,实现企业各分支机构间,内部数据、语音、图像、视频等多种数据的安全传输,为企业提供点到点、点到多点及多点到多点的内部专网通信服务。
int main(void) 

int value = 10; 
int const pValue = &value; 
int item = 34; 
/** 
编译器报错,assignment of read-only variable 'pValue'。说明不能修改指针中存储的地址 

pValue = &item; 
/但是可以修改地址所指向的值/ 
pValue = 24; 
return 0; 
}

<think>好的,用户想了解C语言常量指针指针常量的区别。我需要先回顾一下相关概念,确保自己理解正确,然后再组织语言解释清楚。 首先,根据引用资料,指针常量常量指针的定义不同。引用[1]提到,常量指针是指指针指向的内容是常量,不能通过该指针修改内容,但指针本身可以指向其他地址。语法是const type *ptr或者type const *ptr。例如const int *p,这时候不能使用*p来修改值,但ptr可以指向不同的地址。而指针常量则是指针本身的指向不可变,但内容可变,语法是int* const ptr。比如int* const p = &a;,这时候p不能再指向其他变量,但*p可以修改a的值。 接下来,引用[2][3]也强调了同样的区别,指针常量的重点在于指针的地址不可变,而常量指针则是内容不可变。引用[4]中的代码示例展示了指针常量的使用,比如int* const p = &a;,这时*p可以被修改,但p不能指向其他变量。 需要分清楚const的位置。如果const在*前面,比如const int* ptr,这是常量指针指向的内容不可变;如果const在*后面,比如int* const ptr,这是指针常量指针指向不可变。这一点是关键,用户可能容易混淆两者的位置。 用户可能的疑问点在于如何记忆两者的区别。可以通过const的位置来判断:const靠近类型就是常量指针,靠近变量名就是指针常量。或者用“内容”指针”来区分,比如“常量指针指向的内容是常量,而“指针常量”本身是常量,不能改变指向。 另外,用户可能在实际编程中遇到问题,比如修改指针指向或修改内容时报错,这时候需要根据错误信息判断是哪种情况。例如,如果尝试修改*p的值时报错,可能是常量指针;如果尝试改变指针指向时报错,则是指针常量。 还要注意,可能存在的混淆情况,比如指向常量指针常量,即const int* const ptr,这时候指针指向内容都不能修改。虽然用户的问题没有提到,但作为补充可能会有帮助。 最后,确保回答结构清晰,先定义两者,再语法,再举例,最后对比总结。使用中文,行内公式用$...$,如果有独立公式用$$...$$,不过这里可能不需要数学公式。需要检查引用是否正确,每个引用末尾加上标识符,比如[^1]、[^2]等。</think>### C语言常量指针指针常量的区别 #### 一、核心定义 1. **常量指针** - **定义**:指针指向的内容是常量,不能通过该指针修改内容,但指针本身可以指向其他地址[^1][^2]。 - **语法**:`const type *ptr` 或 `type const *ptr` - **示例**: ```c const int *ptr; // ptr是常量指针 int value = 10; ptr = &value; // 合法 // *ptr = 20; // 非法:无法通过ptr修改value的值 ``` 2. **指针常量** - **定义**:指针指向不可变(地址固定),但可以通过指针修改指向的内容[^4]。 - **语法**:`type *const ptr` - **示例**: ```c int a = 10; int *const p = &a; // p是指针常量 *p = 100; // 合法:修改a的值 // p = &b; // 非法:p的指向不可变 ``` --- #### 二、关键区别 | 特性 | 常量指针 | 指针常量 | |------------------|------------------------|------------------------| | **指针指向** | 可变 | 不可变 | | **指向的内容** | 不可通过指针修改 | 可通过指针修改 | | **const的位置** | `const`在类型前 | `const`在指针变量名前 | --- #### 三、记忆技巧 1. **语法判断法**: - 如果`const`在`*`**左侧**(如`const int *ptr`),表示**内容不可变**(常量指针)[^1]。 - 如果`const`在`*`**右侧**(如`int *const ptr`),表示**指针不可变**(指针常量)[^4]。 2. **中文直译法**: - **常量指针** → “指向常量指针”(保护内容)。 - **指针常量** → “指针本身是常量”(保护地址)。 --- #### 四、进阶案例 1. **常量指针常量**(双重约束): ```c const int *const ptr = &value; // 指向内容均不可变 ``` 2. **混合使用**: ```c const int a = 5; const int *ptr1 = &a; // 合法:常量指针指向常量 int *const ptr2 = &a; // 非法:普通指针无法指向常量(需类型一致) ``` --- #### 五、常见错误场景 1. **错误修改常量指针的内容**: ```c const int *ptr = &value; *ptr = 20; // 编译报错:assignment of read-only location ``` 2. **错误修改指针常量指向**: ```c int *const p = &a; p = &b; // 编译报错:assignment of read-only variable 'p' ``` --- #### 六、总结 - **常量指针**:保护数据,允许切换指向。 - **指针常量**:保护地址,允许修改数据。 - **核心区别**:`const`修饰的是指针本身还是指针指向的内容[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值