- const 和指针
- 1、const 在C和C++中的区别
- 2、const和指针的关系
- 3、常变量与指针
- 4、同类型指针的赋值兼容规程
- 5、练习
- C中以变量为主
int main()
{
const int n = 10;//C中以变量为主
int ar[n] = {1,2};//error
int *p = (int*) &n;
*p = 100;
printf("%n = %d *p = %d n",n,*p);
return 0;
}
- C++中以常量为主
int main()
{
const int n = 10;//C中以变量为主
int ar[n] = {1,2,3,4};//ok
int *p = (int*) &n;
*p = 100;
cout<<"n "<<"*p ="<<*p<
2、const和指针的关系
int main()
{
int a = 10, b = 10;
int *p1 = &a; // 普通指针
const int *p2 = &a; // 指向为常性(解引用为常性)
int const *p2 = &a;
int * const p3 = &a; // 指针变量自身为常性
const int * const p4 = &a; // 指向(解引用)和指针变量自身都为常性
}
3、常变量与指针
int main()
{
const int a = 10;
int *p1 = &a;//error,因为通过*p1 可以改变a 的值
const int *p2 = &a;//ok,*p2改变指向,但不可以通过解引用改变a的值
int *const p3 = &a;//error;const 修饰p3,通过*p3可以改变a的值,但不可以改变指向的地址
const int *const *p4 = &a;//ok,即不可以改变指向,也不可以通过解引用改变值
int *p5 = (int*) &a;//ok,a此时是常量10,无法通过*p 指向常量地址,因此强转,但不安全
return 0;
}
4、同类型指针的赋值兼容规程
int main()
{
int a = 10,b = 20;
int *p = &a;
int *s1 = p;//ok,用s1指p的地址,
const int *s2 = p;//ok,*s2改变指向,但不可以通过解引用改变p的值
int *const s3 = p;//ok, 通过*s3可以改变p的值,但不可以改变指向的地址
const int *const s4 = p;//ok
return 0;
}
5、练习
int main()
{
int a = 10;
int b = 20;
const int *p = &a;
int *s1 = p;//error
const int *s2 = p;//ok
int *const s3 = p;//error
const int8 const s4 = p;//ok
}
p 可以指向任何地址,但是不可以通过 *p 改变 a 的值,s1、 s3可以改变 a 的值,不可以通过 s2 、s4改变a 的值。
int main()
{
int a = 10;
int b = 20;
int const *p = &a;
int *s1 = p;//ok
const int *s2 = p;//ok
int *const s3 = p;//ok
const int8 const s4 = p;//ok
}
对于指针p,它只能指向a的地址,可以改变 a 的值,对于s1,s2,s3,s4他们可以去指向a的地址,也可以去指向a的地址,但是不管它们指向谁的地址,都不能改变p的指向,所以能力没有被扩展,因此都正确
总结:能力强的指针赋值给能力收缩的指针



