C++面试题-指针-指针常量与常量指针
请用代码来解释以下常量指针与指针常量?
指针常量:指向常量的指针。
const int *p1;
int const *p1;
上述两者等价。
const *p1(或者const int *p1),*p1是p1指向的变量的内容,所以p1所指向的内存区的值不能被改变。
#include<iostream>
using namespace std;
int main(){
int a = 1;
int b = 2;
// int const *p1=&a;也可以
const int *p1=&a;//p1保存的是a地址
cout << p1 << endl;
p1 = &b;//p1保存的是b地址
//*p1=4;是错误的
cout << p1 << endl;
return 0;
}
常量指针:把指针指向某对象并且不可被改变指向的变量。
int *const p2=&a; // 必须初始化,是因为指针需要保存一个始终不会改变的地址。
const p2,p2是一个指针,这个指针一旦指向某对象,就不能改变指向为其他对象,所以是一个固定不能改变地址的指针。
#include<iostream>
using namespace std;
int main(){
int a = 1;
int b = 2;
int *const p2=&a;
//p2 = &b;错误,不能再指向其他变量
cout << *p2 << endl;
*p2 = 520;//可以改变指向变量的值
cout << *p2 << endl;
return 0;
}
问:设有如下语句:
int x;
_____
*px=0;
则选择以下哪条语句可将x值设置为0()。
A.int *px; B.int *const px=&x;
C.int const px=&x; D.const int *px=&x;
答:B
分析:
由于*px=0可知,px是一个指针,排除了C选项。由于px需要指向x,int *px语句并没有将px指向x的地址,A选项错。
B是一个常量指针,指针本身是常量,即指针指向变量的地址不能被改变(即改变指向的变量),但是所指向变量的值可以被改变,所以B正确。
D是一个指针常量,指向变量的值不能被改变,但是指针指向的地址是可以改变的,D错。