Content:
-
指针定义
-
获取对象的地址
-
指针值
-
利用指针访问对象
-
空指针
-
赋值和指针
-
其他指针操作
-
void* 指针
一、指针定义:
格式: *d d时变量名 ;定义多个时每个变量前面必须有符号*
相同之处:
1、与引用类似,指针也是实现了对其他对象的间接访问;
不同之处
2、 指针本身就是一个对象,允许对指针赋值和拷贝,而且指针在生命周期内可以先后访问几个不同的对象
3、指针无需定义时赋初值;
4、指针如果没有初始化,也将拥有一个不确定的值;
ps:指针一定要记得初始化,否则后果很糟糕!!!
int val = 12;
int *p = &val; //p是指向名为val的指针 ;ps:引用不是对象,所以不用定义指向引用的指针
//一、指针定义
int *p1,*p2;
double *dp,dp2; //无*的为double型对象
二、获取对象的地址
1、指针存放某个对象的地址,要想获取该地址,需要使用取地址符 &
2、指针的类型要和它所指向的对象严格匹配;(有例外,后面说)
//二、获取对象的地址
double dval;
double *d = &dval;
double *d2 = d;
cout<<dval<<" "<<d<<" "<<d2<<endl;
//下面两个都是类型不匹配
//int *pi = d;
//pi = &dval;
三、指针值
1、指针的值其实就是地址,应属下列4种状态之一:
(1)指向一个对象
(2)指向紧邻对象所占空间的下一个位置
(3)空指针,意味着指针没有指向任何对象
(4) 无效指针,所有情况的值;对无效指针的拷贝或者访问都会引发错误
ps:上述(2)(3)指针都是无对象的,如果访问这类指针对象是不被允许的
四、利用指针访问对象
1、指针指向了一个对象,则允许使用解引用符号 * 来访问该对象
2、对指针的解引用的结果赋值,实际上就是给指针所指的对象赋值
ps:解引用只对真正指向了某个对象的有效指针
//四、利用指针访问对象
int a = 24;
int *b = &a;
cout<<*b<<endl; //由符号*得到指针p所指的对象,输出24
//2、解引用结果赋值
*b = 12;
cout<<*b<<endl; //12
cout<<a<<endl; //12
// & 和 * 不同场景下意思不同
int i = 42;
int &r = i; //引用
int *p3; //指针
p3 = &i; //&为一个取地址符
*p3 = i; //*解引用
int &r2 = *p3; //&为声明,*是解引用
五、空指针
1、不指向任何对象
//五、空指针(null pointer)
//空指针生成方法
//int *p4 = nullptr; 这里为何提示出错???
int *p5 = 0;
int *p6 = NULL;
int zero = 0;
//p6 = zero; //不能把Int变量直接赋值给指针
六、赋值和指针
指针和引用:都是提供对其他对象的间接访问
不同之处:
1、引用本身并非一个对象;一旦定义引用,就无法令其绑定到另外的对象!每次访问的都是最初绑定的那个对象
2、指针和它存放的地址就没有这种限制。给指针赋值就是令其存放到一个新的地址,从而指向一个新的对象
//六、赋值和指针
int x = 42;
int *p7 = 0; //初始化
int *p8 = &x; //初始化并存x地址
int *p9; //如果定义于块内,值无法确定
p9 = p8; //都指向x
p8 = 0; //不指向任何对象
//一条赋值语句到底是改变了指针的值还是改变了指针所指对象的值,最好的办法就是记住赋值永远改变的是等号左侧的对象
p10 = &ival; //p10值发生改变,p10现在指向了ival
*p10 = 0; //ival的值改变了,指针p10并没有变化;指针指向的对象发生改变
七、其他指针操作
只要指针拥有一个合法值,就可以用在条件表达式中;和算术值作为条件一样0代表false;非0代表True
两个类型相同的合法指针,可以利用相等操作符和不相等操作符来比较它,比较的结果是布尔类型;
如果两个指针存放的地址相同则相等,否则反之
指针相同有三种可能:
1、都为空
2、都指向同一个对象
3、都指向同一个对象的下一个地址
//七、其他指针操作
int ival = 1024;
int *pi = 0;
int *pi2 = &ival;
if (pi)
// ...
if (pi2)
// ...
八、void* 指针
特殊的指针类型,可以存放任意对象的地址;但是具体什么类型的对象不了解
不能直接操作void*指针所指的对象;因为不知道对象到底是什么类型,无法确定能在这个对象上做哪些操作
后面会进一步讲述获取void*指针所存地址的方法
double obj = 3.14,*pd = &obj;