C指针(2)——指针在函数中的应用(程序讲解)

3-1.c指针用作函数参数

#include<stdio.h>
  typedef unsigned char uint8_t;   //类型自定义,通过typedef语句重新把unsigned char命名为uint8_t,目的为了方便
  extern void swapdata(uint8_t dat_x,uint8_t dat_y);
int main(void)
{
  uint8_t x,y;
  printf("请输入x,y:");
  scanf("%d,%d",&x,&y);
  printf("交换前:x=%d,y=%d\n",x,y);
  swapdata(x,y);
  printf("交换后:x=%d,y=%d\n",x,y);
  return 0;
}
  void swapdata(uint8_t dat_x,uint8_t dat_y)  
{
  uint8_t temp;
  temp=dat_x;
  dat_x=dat_y;
  dat_y=temp;
}

目的:是为了通过swapdate()函数把实参x,y的值进行交换,上述例子是将形参dat_x,dat_y的值进行交换,但是形参的交换并没有改变实参的交换,因为函数在调用时给形参分配了单独的内存空间,实参的值传递给形参实际是把实参的值放在形参的内存空间,形参的值是实参的备份,因此形参交换,实参并不会交换,不能达到交换实参的目的。 

 结果:

请输入x,y:30,20
交换前:x=30,y=20
交换后:x=30,y=20

3-2 函数调用时,把指针作为函数参数进行传递,即传递变量的地址。在被调函数中,通过指针操作相应的变量,实际操作变量本身。在被调函数中对形参的操作实际就是对实参的操作。

#include <stdio.h>
typedef unsigned char uint8_t;
extern void swapdata(uint8_t *dat_x,uint8_t *dat_y);  //函数参数变成指针
int main(void)
{
  uint8_t x,y;
  uint8_t *p_x,*p_y;
  printf("请输入x,y:");
  scanf("%d,%d",&x,&y);
  p_x=&x;
  p_y=&y;
  printf("交换前:x=%d,y=%d\n",x,y);
  swapdata(p_x,p_y);
  printf("交换后:x=%d,y=%d\n",x,y);
  return 0;
}
  void swapdata(uint8_t *dat_x,uint8_t *dat_y)   //形参为两个指针变量,目的是为了承接实参的值,实参是指针类型,
{
  uint8_t temp;
 temp=*dat_x;    //通过取值运算符*与指针变零dat_x结合,访问实参x;调用swapdate()后,指针变量dat_x指向实参x,对*dat_x的操作实际是对实参x的操作。
 *dat_x=*dat_y;
 *dat_y=temp;
}

 结果:

请输入x,y:10,20
交换前:x=10,y=20
交换后:x=20,y=10

  对比3-1和3-2的根本区别是:前者调用函数,实参是x,y的值;后者调用函数时,实参是x,y的指针,即二者的地址。

      结论:要在被调函数中改变主调函数中的变量值,需要将主函数中变量的指针作为实参,传递给被调函数。

 

猜你喜欢

转载自www.cnblogs.com/happying30/p/9379465.html
今日推荐