(自用)const修饰指针还是指向的变量-辨析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<bits/stdc++.h>
using namespace std;

int main()
{
int const a[]={1,2,3};

cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<"\n";//output:1 2 3
//++a[0];//[Error] increment of read-only location 'a[0]'

/*正确的,但不好复现
{
const int * pp=a;
cout<<pp<<" -> "<<*pp<<"\n";//output:0x73fde0 -> 1

++pp , cout<<pp<<" -> "<<*pp<<"\n";//output:0x73fde4 -> 2
//int * mypp=pp-1;//[Error] invalid conversion from 'const int*' to 'int*' [-fpermissive]

int * ppp = (int *)0x73fde0;
cout<<ppp<<" -> "<<*ppp<<"\n";//output:0x73fde0 -> 1

++(*ppp);
cout<<ppp<<" -> "<<*ppp<<"\n";//output:0x73fde0 -> 2
cout<<a<<" -> "<<a[0]<<"\n";//output:0x73fde0 -> 2

//可以看到,a[0]确实被改变了!!!
}
*/


{
//int * const p=a;//[Error] invalid conversion from 'const int*' to 'int*' [-fpermissive]
//无法声明!

int b[]={100,200,300};
int * const p=b;
cout<<*p<<"\n";//output:100
*p=1000 , cout<<*p<<" = "<<b[0]<<"\n";//output:1000 = 1000
//++p;//[Error] increment of read-only variable 'p'

//结论:p不可以变,但可以改变p指向的东西
}


{
int const *p=a;
cout<<p<<" -> "<<*p<<"\n";//output:0x73fde0 -> 1
//*p=100;//[Error] assignment of read-only location '* p'
++p , cout<<p<<" -> "<<*p<<"\n";//output:0x73fde4 -> 2
//*p=100;//[Error] assignment of read-only location '* p'

//结论:p可以随意变,但p指向的区域永远不能被修改(即:并不只是声明时指向的区域)
}


{
int const * const p = &a[0];
cout<<p<<" -> "<<*p<<"\n";//0x73fde0 -> 1
//++p;//[Error] increment of read-only variable 'p'
//++(*p);//[Error] increment of read-only location '*(const int*)p'

//结论:p被const修饰,不可变;*p被const修饰,所以永远无法通过p改变p指向的区域
}
return 0;
}