#include<iostream>
using namespace std;
int main()
{
int a[5] = {1,2,3,4,5};
const int *ap; //ap是一个指向常量的指针
ap =a; //ap指向非常量a[0]
ap = ap + 1; //ap向后移动一位 指向a[1]
cout << *ap << endl; //*ap=2
//*ap = 10; //不能给常量ap赋值
int *const p =a; // p是一个指向a[0]的常量指针,p1的值不可被改变,这是一个顶层const
int *q = a; //q指向头元素a[0]
//p = q + 1; //错误 p是一个常量指针,指针P的地址不可以改变。
int *aq = &a[1];
//p = aq - 1; //p和aq-1指向的都是a[0],但是p是常量指针不可被赋值
cout << *(aq - 1) << endl; //输出 1
cout << *p << endl; //*p=1
*p = 20;
cout << a[0] << endl; //a[0]=20
q =q + 1; //指针q想后移动一个位置 q指向a[1]
cout << *q << endl; //解引用输出p指向的元素a[1]=2
int &i = a[0]; //定义i为a[0]的引用
i=i+10; //用引用改变a[0]的值
cout << a[0] << endl; //a[0]=30
cout << *p << endl; // *p=30
a[0]= a[0]+2; //直接给a[0]赋值
cout << (a[0]) << endl; //a[0]=32
cout << *p << endl; // *p=32
*(q-1) =20; //通过指针修改a[0]的值
cout << (a[0]) << endl; //a[0]=20
cout << *p << endl; // *p=20
int b[3] = {100,200,300};
int const *j = b; //允许改变j的值,这是一个底层const
++j; //指针向后移动一位 指向b[1];
cout << *j <<endl ; // j=200
b[0] = 1; //改变b[0]的值
cout << b[0]<<endl; //b[0=1]
return 0;
}