”C++指针笔记“

指针是指向另外一个类型的复合类型,另外一种类型的复合类型,与引用类似,指针也实现了对其他对象的间接访问。然而指针与引用又有很多不同点。指针本身就是一个对象,允许对指针赋值和拷贝。和其他内置类型一样,在指针的生命周期内可以指向几个不同的对象。其次,指针无需在定义时赋值。合体它内置类型一样,在块的作用域内定义的指针如果没有被初始 化,也拥有一个不确定的值。

定义指针类型的方法将声明符写成d的形式,其中d是变量名,如果在同一条语句中定义了几条指针,每个变量前面都必须有符号

1
2
int *iP1,*ip2;//ip1和iPhone都是指向int型对象的指针
int *p=&ival;//dp2是只想double类型对象的指针,dp是double型对象

#获取对象的地址
指针存放某个对象的地址,需要用到取地址符(操作符&):

1
2
int ival=42
int *p=&ival;//p存放ival的地址,或者说p是ival的指针

第二条语句把P定义为一个指向int型的指针,随后初始化p令其指向名为ival的int对象。因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。

1
2
3
4
5
double dval;
double *pd=&dval;//正确,初始化为double型的地址
double *pd2=pd; //正确,初始值是指向double对象的指针
int *pi=pd; //错误:指针pi类型和pd类型不同
pi=&dval; //错误:试图把double型对象的地址赋给int型指针

因为在声明语句中指针的类型实际上被用于指定它所指向它所指向对象的类型,所以两者必须匹配。如果指针指向了一个其他类型的对象,对该对象的操作将发生错误。

#指针值
指针的值(即地址)用属下列4种状态之一:
1.指向一个对象。
2.指向紧邻对象所占空间的下一个位置。
3.空指针,意味着没有任何的指向对象。
4.无效指针,上述情况之外的其他值。

#利用指针访问对象
如果指针指向了一个对象,则允许用解引用符(操作符*)来访问该对象:

1
2
3
int ival=42;
int *p=&ival;//p存放着变量ival的地址,或者说p是指针变量ival的指针
cout<<p; //42

对指针解引用直接赋值也可以得到相应的值。

#相关符号的多重含义判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
int i=42;
int &r=i;//&紧随类型名出现,因此是声明的一部分,r是一个引用
int *p;// 紧随类型名出现,因此是声明的一部分,p是一个指针
p=&i;//&出现在表达式中,是一个取地址符
*p=i;//*出现在表达式中,是一个解引用符
int &r2=*p;//&是声明的一部分,*是一个解引用符
return 0;
/*int ival=42;
int *p=&ival;
cout<<*p;
return 0;*/
}

#空指针
空指针不指向任何对象,在试图使用一个指针之前可以首先检查是否为空。例如:

1
2
3
4
int *p1=nullptr;//等价于int *p=0;
int *p2=0; //直接将p2初始化为字面常量0;
//需要先#include<cstdlib>
int *p3=NULL; //等价于int *p3=0;