如何正确使用指针?子函数能影响父函数的前提又是什么呢?

1,首先我们通过一个例子来说一下指针最基本的定义以及用法:
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int *p = &a;
	*p = 100;//a = 100;
	p = &b;
	*p = 200;//b = 200;
	int **pp = &p;
	*pp = &a;//p = &a;
	**pp = 1000;//a = 1000;
	*pp = &b;//p = &b;
	**pp = 2000;//b = 2000;

	return 0;
}


通常情况下,"*"有三层意思(后面还会遇到不同的使用)定义指针;间接访问符(解引用);乘法;&a,取得a的地址,&是取地址符.

int *p = &a;所以,这一句的意思也就是,定义整形指针变量存放整型地址(指针)。其实,"指针==地址".
一般情况下,指针占四个字节,当然这取决于操作平台。在X86或者32位平台指针4字节,在X64或者64位平台指针8字节

2,接下来我们说一下子函数和父函数之间的调用关系:

程序一:

#include <stdio.h>
void swap_error1(int a,int b)
{
	int tmp;
	tmp=a;
	a=b;
	b=tmp;
}
int main()
{
	int a=10;
	int b=20;
	printf("%d,%d\n",a,b);
        swap_error1(a,b);
        printf("%d,%d\n",a,b);//10,20
	return 0;
}
程序二:

#include <stdio.h>
void swap_error2(int *p1,int *p2)//error.未使用解引用
{
	int *tmp;
	tmp=p1;
	p1=p2;
	p2=tmp;
}
int main()
{
	int a=10;
	int b=20;
	printf("%d,%d\n",a,b);
        swap_error2(&a,&b);//10,20
        printf("%d,%d\n",a,b);
	return 0;
}
分析:以上两个程序为什么最终都没有实现交换呢?


由上图我们可以看出:程序一,其实我们只是实现了子函数里的交换,并没有修改父函数中的值。因此,为了实现父函数值得交换,我们可以借用指针。那么就有了程序二的函数设计:定义三个指针变量,int *p1;int *p2;int *tmp;但是发现同样也没有实现值得交换。这又是为什么?

程序三:

#include <stdio.h>
void swap(int *p1,int *p2)//ok."传指针","解引用"缺一不可。
{
	int tmp=*p1;
	*p1=*p2;
	*p2=tmp;
}
int main()
{
	int a=10;
	int b=20;
	printf("%d,%d\n",a,b);
	swap(&a,&b);
        printf("%d,%d\n",a,b);//20,10
	return 0;
}

分析:程序三实现了函数值的交换,所以可以得出:子函数能修改父函数中的内容的前提是:"传指针,解引用".两者缺一不可。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值