int *const p; //const 修饰int *,const修饰p,即p指向地址不变,但*p即其值可变
1 2 3 4 5 6 7
int main() { const int a=10; //想要定义一个指针指向a; int const *p=&a; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int main() { int *q1=nullptr; int *const q2=nulptr; cout<<typeid(q1).name()<<endl; //int * cout<<typeid(q2).name()<<endl; //int * //const若右边没有*,则const不参与类型 int a=10; int *p1=&a; const int *p2=&a;//这里const int*<=int * 是可以的 int *const p3=&a;//int *<=int * 也是可以的 int *p4=p3; //p3是int *,不是int * const }
1 2 3 4 5 6 7 8
int main() { int a=10; const int *p=&a; int *q=p; //int *<=const int *,这里const右边又* }
1 2 3 4 5 6 7 8 9 10
intmain() { constint a=10; //int *p=&a; int *=const int * ?? //const和指针结合 //1.常量不能作为左值<=试图直接修改const //2.不能把常量的地址泄露给一个普通的指针或引用变量<=试图间接修改const *p=30;?
return0; }
const与二级指针的结合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int main() { int a=10; int *p=&a; const int **q=&p; //const右边有指针,类型要考虑进去 //即const int**<=int ** //这是错误的 /* 理解:const int **q指向a,不允许修改,但*p却有可能修改 即可以通过*p修改**q,这是错误的,常量地址放在普通指针中 */ return 0;
}
修改如下:
1 2 3 4 5 6 7
int main() { int a=10; const int *p=&a; //p不是普通指针了 const int **q=&p;
}
或者
1 2 3 4 5 6 7 8
int main() {
int a=10; int *p=&a; const int *const *q=&p; //把*q限定,也是可以的
}
常见二级指针的应用
1.p修改a的值 2.q修改a的值 3.q修改p的指向
1 2 3
const int **q;//**q int *const *q;//*q int **const q;//q
指针const结合总结
1 2 3 4
int**<=const int ** //错误 const int **<=int ** //错误,这两个是和二级指针结合 int**<=int*const* //两边同时去掉前面的int*,即*<=const*,错误 int*const*<=int** //与上同理,可以的,这两个是和一级指针的结合