画个图解释一下
这是数据在内存中的样子,我们创建的指针变量所指的是数据的地址,而对指针进行解引用其实就是通过地址去寻找数据在内存中所在的位置(地址指向的内容)也就是数据本身,了解了这个后让我们来对比一下指针修饰变量的两种情况
- const在*前
像这样:
int a = 20;
const int *p = &a;
这里const修饰的是指针所指向的内容,即*p(内容),这时a的值不能通过指针来修改了
*p=30;
像这样的修改是不可以的,如果对类似的代码进行运行,编译器会对其报错,如下:
但指针变量本身是可以修改的
就像这样
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 20;
int b = 30;
const int *p = &a;
p = &b;
printf("%d", *p);
return 0;
}
这里对指针进行解引用打印出的结果是30,也就是b(指针变量发生了改变,也就是地址发生了变话,那么指针的解引用也就是*p就是新地址下所指向的内容)
当const*在前时是对*p进行修饰,这时我们把*p“固定”住了,
也就是内容“固定”注了,所以我们不能对*p进行修改;但这时p,
也就是地址并没有被固定,所以p还是可以被改变的。
- const在*后
像这样:
int a = 20;
int *const p = &a;
这里的const修饰的是指针变量,也就是p,这时p所指的地址就不能更改了
p = &b;
像这样的修改是不可以的,如果对类似的代码进行运行,编译器会对其报错,如下:
(跟上边那个报错类型一样)
但指针变量所指向的内容(指针的解引用)是可以更改的
像这样
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 20;
int b = 30;
int *const p = &a;
*p = 100;
printf("%d\n", *p);
return 0;
}
这里对指针进行解引用打印出的是我们赋给*p的100,但指针变量p并没有发生变化,也就是地址没有发生变化,变的是地址所指向的内容
当const在*后时是对p进行修饰,这时我们把p“固定”住了,
也就是地址“固定”住了,所以我们不能对p进行修改;但这时的*p,
也就是内容并没有被固定,所以这里*p可以被修改