1.指针的大小
分为指针本身的大小(由系统决定)和在指针运算时候,指针变化大小
①指针本身大小
32位系统大小一般为4,64位系统位8
int* ps = new int;
cout<<"size.ps = "<<sizeof(ps)<<endl;
delete ps;
/*********运行结果**************
size.ps = 8
*******************************/
/*我的电脑是64位系统*/
②指针变化大小
int* ps = new int;
cout<<"size.int = "<<sizeof(int)<<endl;
cout<<"ps = "<<ps<<endl;
ps++;
cout<<"ps = "<<ps<<endl;
ps++;
cout<<"ps = "<<ps<<endl;
delete ps;
/***********运行结果**************
size.int = 4
ps = 0x7c5f60
ps = 0x7c5f64
ps = 0x7c5f68
*******************************/
/*我的电脑的int是4byte,
所以每次加4
如果是short每次加2
char每次加1
以此类推*************************/
2.如何声明一个指针变量?
指针是指向地址空间的一个标记,所以要么新开辟一块地址,要么指向原有的地址;
①指向新开辟的地址
这时候就需要我们的new了
int* ps = new int;//开辟了一块可以存储int大小的空间,我的电脑是4个字节
*ps = 2;//给这个空间存储数据2
cout<<"ps.address = "<<ps<<endl;
ps++;
cout<<"now ps.address = "<<ps<<endl;
delete ps;//new和delete成对使用,养成好习惯
/*******运行结果****************
ps.address = 0xf25f60
now ps.address = 0xf25f64
********************************/
/***************************************
要用来存什么类型数据,就声明什么类型指针
如存char :char* = new char;
存float:float* = new float;
******************************************/
②指向已有的地址
int arr[4] {5,6,7,8};
int* ps = arr;
float var;
float* pw = &var;
delete ps;
delete pw;
/*上面,分别声明了,指向数组的指针,指向变量var的指针*/
3.数组可以看作指针
可以把数组名看作是指向数组首元素地址的指针,只不过,这个指针是个定值,而创建的指针可以变化;
int arr[4] {5,6,7,8};
int* ps = arr;
cout<<"ps = "<<ps<<endl //输出ps地址
<<"arr = "<<arr<<endl;//输出arr地址
//可以看到arr和ps地址完全一致
ps++; //ps可以运算,但是arr不可以,arr++是不合法的;
cout<<"now ps = "<<ps<<endl;
delete ps;
/*********运行结果***************
ps = 0x61fe00
arr = 0x61fe00
now ps = 0x61fe04
*******************************/
4.指针的运算
①解引用
int arr[4] {5,6,7,8};
int* ps = arr;
ps++;
cout<<"*ps = "<<*ps<<endl;
delete ps;
/******运行结果************
*ps = 6
**************************/
/*ps指针原本指向首元素也就是5的存储地址,然后ps++,指向了6的地址,然后*ps就是读取存在现在ps的地址下的值,也就是6*/
②算数运算
int arr[4] {5,6,7,8};
int* ps = arr;
ps = ps + 3;//算术运算
cout<<"*ps = "<<*ps<<endl;
delete ps;
/******运行结果********
*ps = 8
**********************/
③指针和数组间转换
int arr[4] {5,6,7,8};
int* ps = arr;
delete ps;
对于上面的代码,arr[0]和*ps意思一样,arr[2]和*(ps + 2)意思一样;
arr[i] 和 ps[i] 意思一样
另外一般情况下,cout<<arr;和cout<<&arr;结果一样,输出的都是&arr[0];
但是意义不一样,arr是首元素地址,&arr是整个数组地址;
5.指针数组
用指针申请若干个相同类型的空间串
int* ps = new int[10];//申请10个int型空间,和int arr[10];一致
ps[5] = 6;//可以和数组一样赋值操作
delete []ps;//删除要加[]
6.指针和结构体(或者共用体或者枚举,在此只以结构体为例)
正确运用ps->name;和(*ps).name;
struct item
{
int num;
string name;
float val;
};
item it1;
item* ps1 = new item;
item* ps2 = new item;
//尝试写入数据
getline(cin,it1.name);
getline(cin,ps1->name);
getline(cin,(*ps2).name);
cin>>it1.num;
cin>>ps1->num;
cin>>(*ps2).num;
cout<<"it1.name = "<<it1.name<<endl;
cout<<"ps1.name = "<<ps1->name<<endl;
cout<<"ps2.name = "<<(*ps2).name<<endl;
cout<<"it1.num = "<<it1.num<<endl;
cout<<"ps1.num = "<<ps1->num<<endl;
cout<<"ps2.num = "<<(*ps2).num<<endl;
delete ps1;
delete ps2;
上述代码可以看出,如果是针对变量(it1、*ps1、*ps2)就用it1.name,用“.”号,如果是针对指针,用ps1->name,用“->”箭头号