鱼C论坛

 找回密码
 立即注册
查看: 947|回复: 2

[已解决]关于指向常量的指针和常量指针的一点小疑惑

[复制链接]
发表于 2020-5-13 09:38:22 | 显示全部楼层 |阅读模式
5鱼币
指向常量的指针  不能通过解引用*改变常量的值但是可以直接通过改变常量的值来做到常量的变化。  
两种方式在我的理解看来是一样的,解引用通过地址的读取间接改变常量的值。即   *pc = 1024;这样是不可行的
但实际上为什么不对呢?解引用的过程是怎么样的。


文字抽象,附上代码
指向常量的指针  不能通过解引用*改变常量的值但是可以直接通过改变常量的值来做到常量的变化。  
两种方式在我的理解看来是一样的,解引用通过地址的读取间接改变常量的值。即   *pc = 1024;这样是不可行的 
但实际上为什么不对呢?解引用的过程是怎么样的。


文字抽象,附上代码[code]#include <stdio.h>
 int main()
 {
         int num = 520;
         const int cnum = 880;
         const int *pc = &cnum;
         
         printf("cnum: %d. &cnum: %p\n", cnum, &cnum);
         printf("*pc: %d, pc: %p\n", *pc, pc);
         
         pc = #
         printf("num: %d. &num: %p\n", num, &num);
         printf("*pc: %d, pc: %p\n", *pc, pc);
         
         num  = 1024;
         printf("num: %d. &num: %p\n", num, &num);
         printf("*pc: %d, pc: %p\n", *pc, pc);
         
         return 0;
 }
[/code]
最佳答案
2020-5-13 09:38:23
本帖最后由 sunrise085 于 2020-5-13 10:42 编辑
int num=520;
const int cnum=888;
int n=211;
const int *pc=cnum;//指向常量的指针
int *const p=#//常量指针
指向常量的指针,不能通过解引用改变常量的值但可以直接通过改变常量的值来做到常量的变化

意思是不能通过*pc=num的方式修改常量的值,这也是为了保护指针所指向的常量的常量性,但是可以直接改变常量的值,即pc=&num来做到常量的变化。这实际上是指针指向了另一个对象,另一个对象既可以是常量也可以是变量。

常量指针,只能指向变量,而且必须在声明的时候进行初始化,之后不能再改变指针的指向,但是能通过解引用修改变量的值。即不能p=&n,只能*p=211,这样修改num的值。

简言之,
指向常量的指针,被剥夺了通过*pc=num来修改所指向的单元的值的权限,以此来保护所指向的常量不被修改;
常量指针,被剥夺了通过p=&n来修改指针的指向的权限,以此来保护常量指针不被移动位置

最佳答案

查看完整内容

意思是不能通过*pc=num的方式修改常量的值,这也是为了保护指针所指向的常量的常量性,但是可以直接改变常量的值,即pc=&num来做到常量的变化。这实际上是指针指向了另一个对象,另一个对象既可以是常量也可以是变量。 常量指针,只能指向变量,而且必须在声明的时候进行初始化,之后不能再改变指针的指向,但是能通过解引用修改变量的值。即不能p=&n,只能*p=211,这样修改num的值。 简言之, 指向常量的指针,被剥夺 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-13 09:38:23 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-5-13 10:42 编辑
int num=520;
const int cnum=888;
int n=211;
const int *pc=cnum;//指向常量的指针
int *const p=#//常量指针
指向常量的指针,不能通过解引用改变常量的值但可以直接通过改变常量的值来做到常量的变化

意思是不能通过*pc=num的方式修改常量的值,这也是为了保护指针所指向的常量的常量性,但是可以直接改变常量的值,即pc=&num来做到常量的变化。这实际上是指针指向了另一个对象,另一个对象既可以是常量也可以是变量。

常量指针,只能指向变量,而且必须在声明的时候进行初始化,之后不能再改变指针的指向,但是能通过解引用修改变量的值。即不能p=&n,只能*p=211,这样修改num的值。

简言之,
指向常量的指针,被剥夺了通过*pc=num来修改所指向的单元的值的权限,以此来保护所指向的常量不被修改;
常量指针,被剥夺了通过p=&n来修改指针的指向的权限,以此来保护常量指针不被移动位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-13 10:30:51 | 显示全部楼层
解引用的过程,其实就是取指定内存地址里的值,这个地方 *pc 不能被赋值的原因是 前面有 const 保护, 这个保护是在编译时就不会通过。意思是不能向pc指向的地址赋值。但是并没有说 pc 这个指针自身不可被改变。我记得有种写法是

int * const pc ; 这样 pc 指针就保护,不能更改pc指针,但是*pc里的值是可以改变的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 02:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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