C++ 指针

Content:

  1. 指针定义

  2. 获取对象的地址

  3. 指针值

  4. 利用指针访问对象

  5. 空指针

  6. 赋值和指针

  7. 其他指针操作

  8. 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; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaichu2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值