#include<iostream>
using namespace std;
int main(){
/*
指针的定义和使用
*/
int a = 10;
//定义指针:数据类型 * 指针变量名
int * p;
//让指针记录变量a的地址
p = &a; // &取址符
cout << &a << endl;
cout << p << endl;
//使用指针,指针可以读写其指向的内存
//通过解引用的方式可以找到指针指向的内存
//指针前加 * 表示解引用,可找到指针指向的内存中的数据
*p = 1000;
cout << a << endl;
cout << *p << endl;
/*
指针所占的内存空间
不管何种数据类型的指针,在32位环境下占用4字节,在64位环境下占用8字节;本地默认环境一般为32位
*/
int b = 20;
int * pp = &b;
cout << sizeof(int *) << endl; //4 'int *'即为指针pp的数据类型
cout << sizeof(pp) << endl; //4
cout << sizeof(double *) << endl; //4
cout << sizeof(float *) << endl; //4
cout << sizeof(char *) << endl; //4
/*
空指针&野指针
空指针:指针变量指向内存中编号为0的空间,用作初始化指针变量,注意空指针指向的内存不可访问
野指针:指针变量指向非法的内存空间,程序中应避免野指针,会报错
*/
int * p1 = NULL;
//*p1 = 100; //程序崩溃报错,0~255内存编号是系统占用的,不可以人为访问
cout << p1 << endl;
int * p2 = (int *)0x1100; //随便指向一个内存,查看是否有权限读取
cout << p2 << endl;
//结论:空指针和野指针都不是我们人为申请的空间,因此不要访问!
/*
const修饰指针
三种情况:
const修饰指针--常量指针
const修饰常量--指针常量
const既修饰指针又修饰常量
*/
a = 10;
b = 20;
// 1 常量指针:指针指向的值不可以改,指针的指向可以改
const int * _p = &a;
//*p = 20; //报错
_p = &b; //可以
// 2 指针常量:指针指向不可以改,指针指向的值可以改
int * const _p2 = &a;
*_p2 = 100; //可以
//_p2 = &b; //报错
// 3 同时修饰:此时指针指向和指针指向的值都不可以改
const int * const _p3 = &a;
//*_p3 = 100; //报错
//_p3 = &b; //报错
// 区分技巧:看const右侧紧跟着的是指针还是常量,是指针就是常量指针,是常量就是指针常量
return 0;
}