常量指针和指针常量有什么区别
区别:
1、本质
指针常量:本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。
常量指针:本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。
2、地址
指针常量:在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。
常量指针:指针可以指向其他地址
3、内容
指针常量:指向的内容可以修改
常量指针:在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。
扩展资料
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。
在32 位平台里,指针本身占据了4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。
参考资料:百度百科 - 指针
int * const p = &a //指针常量,*p可以修改*p = 8;(OK)
p不可以修改 p++(ERROR)
int a,b;
const int *p = &a;//常量指针 *p不可修改 *p = 8;(ERROR)
p 可以修改 p = &b (OK)
还有一种
const int * const p = &a; // *p 和 p均不可改变了
非常感谢!
关键要看const修饰的是谁
int const const int的写法是一样的
指针的话看const离谁( 是‘*’ 还是‘指针变量名’)比较近就是修饰谁的,比如
const * 表示带*运算对象的是常量,也就是*p 不可变 (暗示p可变,p不带‘*’ 嘛)
* const 变量名 表示变量名是常量 也就是p不可变 (暗示*p可变,const没有修饰‘*“ 嘛)
指针常量是指--指针本身是常量。它指向的地址是不可改变的,但地址里的内容可以通过指针改变。它指向的地址将伴其一生,直到生命周期结束。有一点需要注意的是,指针常量在定义时必须同时赋初值。
2.使用方法
写法上的区别:
常量指针:const 在*之前 指针常量:const在*之后。
使用举例:
(1) 常量指针使用:
如 int b, c;
int const *a;
a = &b;
a = &c;
都可以,唯独它指向的内容不能被修改。如:*a=20;这是违法的!错误!
(2) 指针常量使用
如 int a ,b;
int * const p = &a;
表示p是一个常量指针它指向变量a的内存。指针常量不能再用p指向其他变量,如 p = &b; 错误!可以修改指向内存的值,如:* p = 20; 指针常量声明的时候必须像上式那样赋初值。
指针常量也不能释放,用p指向NULL,即
p = NULL;
会在编译时报错
/opt/test/test.c:649: error: assignment of read-only variable `p'
还有一个记住他们不同形式的技巧!看const关键字,他后面的不可修改,如int * const a = &b; 后面是a,则说明a不能修改!
int const * a = &b;后面是*a则说明*a不可被修改!
===========不管中文翻译怎么理解,你只要能搞清楚定义就好了。
Pointer to constant:【常量指针】:指向一个常量;(const修饰的是*ptr,是指向的值)
const int *ptr;
int const *ptr;
Constant pointer to variable:【常指针】:指针固定地址,值随便改;(const修饰的是ptr,是指针)
int *const ptr;
constant pointer to constant:【常量常指针】:固定地址固定值;
const int *const ptr;
===========如下答案我改了下
int a,b;
//----eg1:const *p,*p即值不可以修改,p即地址可以修改。【常量指针】
const int *p = &a;
*p = 8; //ERROR
p = &b; //OK
//----eg2:* const p,*p即值可以修改,p即地址不可以修改。【常指针】
int * const p = &a;
*p = 8; //OK
p = &b; //ERROR
//----eg2:还有一种,*p 和p即值和地址均不可改变了。【常量常指针】
const int * const p = &a;
*p = 8; //ERROR
p = &b; //ERROR
====说说中文翻译:常量指针、常指针、指针常量
我觉得先说说中文语法:比如说黄色橘子,它本身是个橘子,只是是黄色类型的橘子,所以说修饰词在前,本质词在后,先搞清楚这个。
然后再看:
----指针常量:那就是描述一个常量,只是是指针类型的,也就是地址类型的,所以这个地址既然是常量那地址就不可变,但是地址里面的内容可变,那就应该定义为* const p,const修饰p这个地址,表明地址是不可变的。
(但是问题来了,这为什么是个常量,不还是个指针吗?所以到底怎么理解“指针常量”?按照前面的解释就是一个不变的指针,所以我更偏向于叫它“常指针”)
----常指针:如上所说,也就是说这是个恒定的指针,是个不变的地址。
----常量指针:那本质就是指针,也就是指向常量类型的指针,所以这个指针本身是可变的,但是指向的值不能变,所以定义为const *p,const修饰*p,即p这个指针指向的值,表明值是不可变的。
(这里不能理解为常量类型的指针,因为按照我们的习惯,比如“整型指针”说的是这个指针指向一个整型的值。如果你理解为常量类型的指针,那就是说这个指针是常量,又绕进去了)
```
int a;
int * const p = &a //指针常量,*p可以修改*p = 8;(OK)
p不可以修改 p++(ERROR)
int a,b;
const int *p = &a;//常量指针 *p不可修改 *p = 8;(ERROR)
p 可以修改 p = &b (OK)
还有一种
const int * const p = &a; // *p 和 p均不可改变了
int const *p或者const int *p:指向常量的指针(*p称为指针常量,不过一般没有这种说法),不能通过该指针来改变对象的值;指针自身是变量,故其指向可变
int *const p:常量指针,必须初始化,且指针本身是常量,其指向不可变;但所指向的值不一定是常量