一、指针变量作函数参数
问题提出·:如何调用函数交换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);
这样就完成了指针调用函数了!