C语言,数组名,指针常量和常量指针

先介绍指针常量和常量指针

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 
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的值

  

 

转载于:https://www.cnblogs.com/GH-D/p/8290351.html

你可能感兴趣的:(c/c++)