首先 可以通过指针来保存一个地址
简单说:指针就是一个地址 可以将其理解为指针定义
别人问你 指针是什么 大声告诉他指针就是一个地址
定义指针 语法:数据类型 * 指针变量名
例如: int * p
int a =10; int*p;
p = &a; p保存了a的地址 可知p是指针
0xAA5c 0xAA5c
指针前加*代表解引用,指到指针指向内存的数据
*p=10; 可赋值修改参数
int *p; 两个等于 int *p=&a;(创建的指针直接指向a数据地址)
p =&a;
空指针:指针变量指向内存中编号为0的空间 (初始化) 如图所示
指向0点位置 0-255是系统内存
野指针:指针变量指向非法的内存空间
//不要运行该代码
#include<iostream>
using namespace std;
int main(){
//野指针:指针变量指向非法的内存空间
int * p=(int *)0x1100; //没申请
//访问野指针报错
cout<<*p<<endl;
system("pause");
return 0;
}
//总结:空指针和野指针都不是我们申请的空间,因此不要访问
int * p=(int *)0x1100; //没申请
这一句是核心代码 他直接调了一个没申请的内存,所以编译成功,但运行不成功
总的来说一句
空指针不空,野指针不野
接下来讲常量指针和指针常量 看const位置
就名字就能看出 哪个放到前面哪个就更重要
例如 常量指针
int *const p=&a;
特点:指针指向(地址)可以修改,但指针指向指向的值不可以修改
p=&b; 对
*p=20; 错
例如 指针常量
const int *p2=&a;
特点:指针指向(地址)不可以修改,指针指向指向的值可以修改
*p2=100; 对
p2=&b; 错
#include<iostream>
using namespace std;
int main(){
//看*和const位置关系
//1.const int * p=&a; 常量指针---常量重要
//特点:指针的指向(地址)可以修改,但是指针指向的值不可以修改
int a=10;
int b=10;
const int * p=&a;
//*p=20;错误的 值
p=&b;//正确的 地址
/*---------------------------------------------------------------*/
//2.int * const p=&a; 指针常量--指针指向重要
//特点:指针的指向不可以改,指针指向的值可以改
int * const p2=&a;
*p2=100;//正确的 值
//p2=&b;错误的 地址
/*---------------------------------------------------------------*/
//3.const int *const p=&a;
//特点:指针的指向和指针指向的值都不可以改
const int * const p3=&a;
// *p3=100;错误
// p3=&b;错误
system("pause");
return 0;
}