一,指针的定义创建赋值使用
1.定义
int a=10;
int *p; //两种方式:int *p; int* p;
p = &a;
2.创建和赋值
double b=1.5;
double* p1; //指针变量的类型与要指向的变量数据类型保持一致
p1 = &b; //先创建,再赋值
int c=10;
int *p2 = &c; //创建时赋值
int d=10,e=20;
int *p3=&d,*p4=&e; //连续创建多个
3.使用
①:指针变量能指向任何数据类型(int、double、bool、char、数组、结构体······),也能指向指针变量。
int f=100;
int *p5=&f;
int *p6=p5;
cout<<p5<<' '<<p6<<endl;
cout<<*p5<<' '<<*p6<<endl;
②:通过指针可以找到数据在内存中的位置
cout<<p<<endl; //0x6ffe14,指针变量保存的是地址!
③:通过指针运算符 * ,获取指针所指向的变量的值
cout<<*p<<endl; //10
④:修改数据、输出数
*p=20; //p 等同于 &a 表示变量a的地址
cout<<*p<<endl; //20 *p 等同于 a 表示变量a代表的内存中的数据
cout<<a<<endl; //20 *p=20 等同于 a=20 表示对变量赋值
二,指针数组
一组指针变量的数据
int *p8[5]; //p8指针数组变量名称 5指针个数。数组中的5个元素,都是指向 int 的指针!
int arr[5]={1, 2, 3, 4, 5}; //创建整型数组arr
for(int i=0; i<5; i++) cout<<arr[i]<<endl;
int *p7=&arr[0]; //创建指针变量p11指向第一个元素的地址
*p7=100; //修改数据
for(int i=0; i<5; i++) cout<<arr[i]<<endl;
int *p8[5]; //创建指针数组p12
for(int i=0; i<5; i++){
p8[i]=&arr[i]; //给数组元素依次赋值为arr中每个元素的地址
cout<<*p8[i]<<endl; //访问每个指针指向的数据
}
三,结构体指针
指向结构体变量地址的指针,称为结构体指针。
//结构体指针 访问成员变量格式: 指针名->成员变量名
struct stu{
int id;
string name;
double score;
};
stu g = {1,"燃燃",85.5}; //创建结构体变量g并初始化
stu *p9 = &g; //创建指针变量并初始化
cout<< p9->id << ' ' << p9->name << p9->score <<endl;
// 1 燃燃 85.5
p9->score = 99;
cout<< p9->score <<endl; // 99
四,空指针
赋值为“NULL”或者“nullptr”的指针变量称为空指针,创建指针变量时不确定存储的地址。
//可以利用空指针进行分支判断
int *p10=NULL;
if(p10==NULL){
cout<<"指针p10是空指针"<<endl;
}
if(p10!=NULL){
cout<<"指针p10不是空指针"<<endl;
}
//空指针创建
int *p11 = NULL; //p11、p12称为空指针,NULL本质是0 表示一个空地址。
cout<<p11<<endl; //0
cout<<*p11<<endl;//无法访问并退出程序。
//int *p12 = nullptr; //nullptr是C++新增的空指针表示方式
//cout<<p12<<endl; //0
//cout<<*p12<<endl;//空指针指向的内存区域无法访问!