常量指针
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后面的值不能被改变。
非常量指针不能指向常变量。常变量只能由常量指针指向