指向指针的指针

1.通过指向指针的指针可以用一般的子函数来实现动态内存的分配:

#include<stdio.h>
#include<stdlib.h>

void quirmem1(int **pp, int n);

int main()
{
	int *p=NULL;
	quirmem1(&p, 2);
	*p=123;
	printf("%d\n", *p);
	return 0;
}

void quirmem1(int **pp, int n)
{
	*pp = (int *)malloc(n);
}


如果不用指向指针的指针,那么就得用指针函数通过return一个指针来实现动态内存的分配:

#include<stdio.h>
#include<stdlib.h>

int  *quirmem2(int *m, int n);

int main()
{
	int *p=NULL;
	p = quirmem2(p, 2);
	*p = 123;
	printf("%d\n", *p);
	return 0;
}

int *quirmem2(int *m, int n)
{
	m = (int *)malloc(2);
	return m;
}


假如是不通过以上两种方法,试图通过一般的子函数利用指针来申请内存是不行的:

#include<stdio.h>
#include<stdlib.h>

void quirmem1(int *p1, int n);

int main()
{
	int *p=NULL;
	quirmem1(p, 2);
	*p=123;
	printf("%d\n", *p);
	return 0;
}

void quirmem1(int *p1, int n)
{
	p1 = (int *)malloc(n);
}

分析:

指针作为函数参数的意义:当将指针作为参数时,实参向形参传递的是地址,在函数执行过程中,既可以对该参数指针进行处理,也可以对该参数指针所指向的数据进行处理,(以上程序段来说就是可以对p或*p进行处理)。由于此时形参和实参都是指向同一个存储单元,因此当形参指针所指向的数据改变时,实参指针所指向的数据也作相应的改变,因此这时的形参可以作为输出参数使用。

按照上述原则,那么例子3应该是正确的啊!实际则不然,问题就是在例子3中,实参和形参是指向同一个地址,它们只是指向相同,但它们自身的地址不是同时申请的(注意指向指针的指针pp作为参数在传递时,传递的是指针p的地址,而指针p1做参数传递时传递的是改指针所指向的数据的地址!),就是说当p1申请内存时,p仍然是空指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值