关于指向常量的指针和常量指针的一点小疑惑
指向常量的指针不能通过解引用*改变常量的值但是可以直接通过改变常量的值来做到常量的变化。两种方式在我的理解看来是一样的,解引用通过地址的读取间接改变常量的值。即 *pc = 1024;这样是不可行的
但实际上为什么不对呢?解引用的过程是怎么样的。
文字抽象,附上代码指向常量的指针不能通过解引用*改变常量的值但是可以直接通过改变常量的值来做到常量的变化。
两种方式在我的理解看来是一样的,解引用通过地址的读取间接改变常量的值。即 *pc = 1024;这样是不可行的
但实际上为什么不对呢?解引用的过程是怎么样的。
文字抽象,附上代码#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;
} 本帖最后由 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 不能被赋值的原因是 前面有 const 保护, 这个保护是在编译时就不会通过。意思是不能向pc指向的地址赋值。但是并没有说 pc 这个指针自身不可被改变。我记得有种写法是
int * const pc ; 这样 pc 指针就保护,不能更改pc指针,但是*pc里的值是可以改变的。
页:
[1]