指针:一级指针与二级指针(C)& 指针与引用(C++)

C++中

#include<stdio.h>
class A
{
	public : int num;
	//... 
};
 
void _create1(A* a)				//传入指针
{
	a=new A();
	a->num = 2;
}
 
void _create2(A* &a)			//传入指针引用(相当于C中的二级指针——指针的指针)
{
	a=new A();
	a->num = 2;
}
 
int main()
{
	A* b = new A();
	b->num = 1;
	printf("刚申请指针,地址为%d\n",b);
	printf("%d\n", b->num);
	
	_create1(b);
	printf("传入指针后,地址为%d\n",b);
	printf("%d\n", b->num);
	
	_create2(b);
	printf("传入指针引用后,地址为%d\n",b);	
	printf("%d\n", b->num);
}

在这里插入图片描述

说明

  1. 传入指针和传入指针引用都是传入了一个地址值,区别在于形参传入的是指针的那个函数里如果重新为指针指向的变量分配一个地址空间,它在主函数里是体现不出来的,主函数这个变量的地址空间并未改变。而对于形参传入的是指针引用的那个函数,重新为变量分配地址空间能够成功影响主函数里的这个变量。成功被影响了,就相当于重新为A类分配了地址空间,A的成员都不再和原来的相同,而是新设定的2。
  2. 注意这个讨论的是传入的形参不论有没有*&修饰,前提就它本来就是个指针(看主函数里b的定义,b本身就是个指针)。如果对于一个普通变量来说,就不能讨论这个问题了。我把b改为了普通变量,然后试着传递b的地址给那两个函数,但对于void _create2(A* &a)来说,是有编译错误的,原因我觉得是这样的:根本没有办法指出普通变量的地址的地址~(但可以指出指针的地址,这就相当于普通变量的地址的地址。同样的,也无法指出指针的地址的地址。进一步说,就是你可以找个东西(这个东西就是指针)指向普通变量的地址,指向之后,由于指出的这个普通变量的地址并没有保存在内存中,所以不可能指出普通变量的地址的地址。可以画图试试)
    在这里插入图片描述
  3. 就像一个普通变量如果直接传入值就无法使主函数里这个值改变;而如果传入的是这个普通变量的地址,就可以使主函数里这个值改变。一样的道理,只不过把普通变量换成指针。所以就相当于指针的指针,二级指针。
  4. 如果没看懂,请先看下面的。

C中

这里写的很清楚了。

发布了53 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jy_z11121/article/details/96859322