自己给自己劝退一波~
先介绍指针常量和常量指针
const int *p; //这是个指针常量 int const* p; //这是个常量指针
const是常量修饰符,被修饰的就是一个常量,常量的特性就是不能改变。
先介绍指针常量,
const int *p;
int i=2;
p=&i;
这里*p就是一个常量,他的值不能改变,也就是不能再通过*p=1; 这样赋值而去改变 i 的值,但可以通过直接i=1;这样改变i的值,此时*p的值也相应变为了1
int const* p=NULL; int i=1;
p=&i;
常量指针顾名思义,可以认为指针是常量,常量指针只能被赋值一次,指针的值不能改变后面再进行赋值会报错,不过第一次赋值NULL,让它成为空指针是允许的,因为空指针很特殊。*p的值可以改变
这里有个值得注意的地方
#include <stdio.h> int main() { const int i=10; int *p; p=(int *)&i; *p=100; printf("%d\n",i); return 0; }
这段程序,在某些编译器里是可以改变 i 的值的,而某些不能。。。看情况吧,不过在c++里是肯定不允许改变的,应该会直接报错
前面介绍指针常量和常量指针是为了介绍下面的数组名,从这篇文章中得到的思考 https://zhuanlan.zhihu.com/p/24799071?iam=83d196fe2b966cf160601b3be0de2003&utm_source=com.tencent.tim&utm_medium=social
...其实这个我还是不是很懂,它的意思就是数组名不是指针常量,因为数组的官方定义里没有const修饰,我给出自己的理解
如果数组名是指针常量,那么为什么不可以进行++,--操作?
数组本身就是一种类型,所以数组名不是指针
而进行取内容运算时,数组名就会隐式转换为指针 //隐式转换,像char str=97;而%c输出str,得到的是a,这样子
二维数组递推,实际上就是元素类型是数组的数组 //有点绕,但思维就这样的,看个人的逻辑思维理解能力,反正我是不太懂(ノ ̄д ̄)ノ
关于指针的左值和右值是什么,这里就简单说下
int a = 10,b; int *d ; d = &a; //d位于左边,表示的是存储d这个指针变量本身的内存地址。 b = *d; //d位于右边,表示的是d 表示的是存储变量a的内存地址。*d就是得到了a内存地址里a的值