#include<iostream>
using namespace std;
int main()
{
//定义一个变量
int a = 10;
/*int* p 是定义一个指针,后面 = &a是取a的地址,
将a的地址传递给指针,切记指针的作用只有保存地址*/
int* p = &a;
//*p的意思是代表解引用,这样可以找到指针指向地址里面所包含的数据
*p = 20;
cout << a << endl;
//下面这个语句的作用是检测指针内存空间,指针在x86也就是32位下是4个字节,在x64也就是64位下是8个字节
//可以用数据类型来检测,也就是int *,但用p的话也可以,因为p的数据类型也是int *,也就是指针
cout <<"指针的内存空间为:" << sizeof(int*) << endl;
cout << "指针的内存空间为:" << sizeof(p) << endl;
//空指针
//也就是将指针指向内存中编号为0的空间,作用是初始化指针
//有些情况下空指针指向的内存是无法被访问的 eg: cout << *p1 << endl;
int* p1 = NULL;
//cout << *p1 << endl;
//野指针
//野指针也不能访问其指向的内存,有权限 eg: cout << *p2 << endl;
int* p2 = (int*)0x1100;
//cout << *p2 << endl;
//指针的三种形式:
//常量指针
//常量指针的指向的值不可以修改,指针的指向可以修改
//eg:*p3=20,这个就是指向的值修改了,不可以修改所以是错的
//eg:p3=&c,这个是指针的指向修改了,可以修改所以是对的
int b = 10;
const int* p3 = &b;
//指针常量
//指针常量的指向的值可以修改,指针的指向不可以修改
//eg:*p4=20.这个是指针指向的值修改了,可以修改所以是对的
//eg:p4=&d,这个是指针的指向修改了,不能修改所以是错的
int c = 10;
int* const p4 = &c;
//const同时修饰指针和常量
//const同时修饰指针和常量修改指针指向的值和修改指针的指向都是不允许的
//eg:*p5=20,这个指针指向的值修改了,不能修改所以是错的
//eg:p=&e,这个是指针的指向修改了,不能修改所以是错的
int d = 10;
const int* const p5 = &d;
//总结,比如const int * p=&a;const后面是*p,所以*p不能动,也就是指针指向的值不能动
//再比如,int * const p=&a;const后面是p,所以p不能动,也就是指针的指向不能动
//再就是读法,看见*号就读指针,看见const就读常量,
//比如const int *p=&a;读法就为常量指针
system("pause");
return 0;
}