【论指针(2)】指针与函数


一、指针变量作函数参数

问题提出·:如何调用函数交换2个数的值?(请用指针变量完成)

分析:

第一步:根据题意我们可以写出的主程序代码:

void main(void)

{

int a,b,*pt1,*pt2;

a=5;

b=9;

pt1=&a;

pt2=&b;

if(a<b)

{

Swap(pt1,pt2);

}

}

 

第二步:我们开始写Swap()函数,因为传递的是指针所以我们的参数要用指针变量来接收,如下:

void Swap(int *p1,int *p2)

{

……………

}

上面各数之间的关系如下:

p1=pt1,p2=pt2,*p1=*pt1=a=5,*p2=*pt2=b=9;


第三步:针对上面的调用函数,我们如何利用接收到的指针变量实现a,b值得改变呢?

如果我们不调用函数实现,很简单,如下:

int temp;

temp=a;

a=b;

b=temp;


但现在我们现在接收到的是*p1和*p2是指针变量,根据第二步中的关系,上面的函数可改成:

int temp;

temp=*p1;

*p1=*p2;

*p2=temp;

所以这个调用函数就是你这样:

void Swap(int *p1,int *p2)

{

int temp;

temp=*p1;

*p1=*p2;

*p2=temp;

}

最后注意以下2个函数:

void Swap(int *p1,int *p2)

{

int *temp;

*temp=*p1;

*p1=*p2;

*p2=*temp;

}

虽然这个能实现,但因为*temp内存单位不确定性,为对数据带来影响


void Swap(int *p1,int *p2)

{

int *temp;

temp=p1;

p1=p2;

p2=temp;

}

这个注意了,这个只是对p1,p2着2个参数进行交换,a,b的值照样没变!换句话说,我们交换值是数据交换而不是地址交换,因为当我们定义了一个数据,该数据的地址是不能改变的,只能改变数据!

 

二、函数返回指针

我们知道int fun(void)意味着返回值为一个int型,现在我们函数返回的是一个地址,那如何通过这个地址表示该地址对应的数据呢?当然是用*操作,把*加在函数名前面就表示该地址指向的数据,所以*fun(void)表示返回地址的数据,那这个数据是什么类型呢?我们在前面再加int,就形成了int *fun(void)这种形式!

所以上面各字符之间的关系如下:

   fun(void)=地址

   *fun(void)= 数据

   Int = 数据类型


问题提出·:如何在数组buf[20]的第10个位置放入5这个数据?

分析:

第一步:如果我们知道了第10个位置的地址,那就简单了!于是我们需要调用一个能找到位置地址的函数Seat(),并且返回的是地址,由此我们的主函数如下:

Void main(void)

{

char *p10,buf[20];

p10=Seat();

*p10 =5;

}

 

第二步:由第一步我们知道Seat()是一个指针返回函数,定义如下:

 char *Seat(void)

{

char *ten;

……..

Return (ten)

}

 

第三步:,我们知道数组buf的首地址为buf,第10个位置的地址就是buf+10

所以调用函数如下:

char *Seat(void)

{

char *ten;

ten=buf+10;

Return (ten)

}

这样就是可以实现了!

 

三、指向函数的指针

上面我们说过,其实CPU运行程序是过去地址一步一步去取出程序运行的,包括函数,而函数相当于数组,是有入口地址,这样才能保证函数一步一步运行下去!也因此我们即使拿到了地址也要取得数据进行对数据的处理!

现在的指向函数的指针其实就是指向函数的入口地址。而且规定函数名就是函数入口地址。

格式如下:

int (*p)(int a,int b)

问题提出:用指针调用函数int add(int a,int b)?

第一步:函数的指针是add,这样我们就可以得到函数入口地址了,程序如下:

Int *pt;

pt = add;

第二步:既然知道了函数入口地址,利用*调用就可以了,代码如下:

 (*pt)(1,2);

这样就完成了指针调用函数了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值