指针常量和常量指针

常量指针
VNote下载:https://github.com/tamlok/vnote/releases

  • 特征:指针所指向的内容不可以通过指针的间接引用(p)来改变。意思是p是右值。但是可以修改指向
  • 例如:
 const  	 int x = 1;
 const 	int * p1;
 p1 = &x; // 指针P1的类型是(const int *)
 cout << *p1; //right,*p1 = 1,可以修改指向,但修改的指向只能是const int*
 *p1  = 10; //error;常量指针,采用底层const修饰,不能通过解引用修改所指对象的值
char* s1 = "hello";//error,因为hello是常量,所以不能通过s1修改hello值,把字符串的首地址存在s1里面去
const char * s2 = "hell"; //correct,因为hell是常量,所以不能通过s2修改字符串

指针常量
1.指针本身的内容是个常量,不可以改变。可以解引用改变其内容,但是不可以改变指向,一般函数名就是指针常量

int x = 1, y = 1;
int * const p2 = &x; //常量P2的类型是int*
*p2 = 10;		//ok -> x = 10;通过解引用修改x的值
p2 = &y; 		//error, p2 is a const,不能被修改

数组名就是数组的首地址的别名。 所以数组名是一个指针常量。
所以:

//数组定义方式:

int a[] = {1,2,3};
//const char* a1 = "hello"可以的,但char *a1 = “hello”不行
a = a+1;  //error! 因为常量a是不能做左值运算的,他的值不允许被修改

指针的内存布局
在这里插入图片描述
常量区是由低地址位向高地址位伸展。栈区相反。
a和pb是常量,所以放在常量区。b和pa是变量所以放在栈区。
假设a的地址是0x13fc,pa指向a的地址,所以pa的值为0x13fc。而pa是放在栈区的变量,他在栈区的地址是0x24fc。(是不能通过*pa修改a的值的,因为pa是变量,a是常量)。而pb是指针常量,pb指向b的地址,假设b的地址位0x2500,所以pb的值为0x2500.pb在常量区的地址是0x1400.(可以通过*pb修改b的值,但不能改变指向,因为pb是指针常量)在这里插入图片描述
const后面的值不能被改变。
非常量指针不能指向常变量。常变量只能由常量指针指向

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值