指针的应用(c语言)——(子函数实现交换父函数中变量的值)
2018-04-08 14:19
567 查看
子函数实现交换父函数中变量的值
int main() { int a=10; int b=20; Swap(a,b);//若实现a,b值交换,Swap()函数该怎么写? printf("%d %d\n",a,b); return 0; }
子函数——被调用函数(Swap());父函数——调用函数(main());
这里是交换a,b 值的三种方法,你认为哪个正确呢?void Swap1(int a,int b){
int tmp= a;
a=b;
b=a;
}
void Swap2(int *p1,int *p2) { int *tmp=p1; p1=p2; p2=tmp; }
void Swap3(int *p1,int *p2) { int *tmp; *tmp = *p1; *p1 = *p2; *p2 = *tmp; }
我们都运行一遍:
Swap1 ,Swap2运行结果都没用达到预期:
Swap3运行中断
这是为什么呢?接下来,我们来逐个分析:
Swap1(error):void Swap_error1(int a,int b)//只是交换参数列表中的a,b的值
{
int tmp= a;
a=b;
b=a;
}
Swap2(error):void Swap_error2(int *p1,int *p2)//a,b值未发生交换,只是交换了p1,p2指针的指向
{
int *tmp=p1;
p1=p2;
p2=tmp;
}
Swap3(error):void Swap_error3(int *p1,int *p2)//指针运用错误
{
int *tmp; //野指针,悬挂指针
*tmp = *p1;//tmp为野指针,解引用会导致程序崩溃
*p1 = *p2;
*p2 = *tmp;
}
怎么来写Swap()函数呢?
要想改变父函数变量的值,就要在子函数中找到父函数的变量。而参数列表只是简单地拷贝实参,所以子函数得到的a,b是“假的,复制品”,只就是Swap1()没达到预期的原因。
怎么找父函数的变量呢?当然要想到指针了,将父函数a,b的地址传递给参数列表,这样子函数就找到父函数的变量了。void Swap(int *p1,int *p2)//得到a,b地址,交换a,b的值
{
int tmp=* p1;
*p1=*p2;
*p2=tmp;
}
学会了吗?再来试一道题吧!int main()
{
int a = 10;
int *p = &a;
p = NULL;
Fun(p);//怎么实现把p改为空指针?
printf("%d\n",*p);
return 0;
}
此处为什么会崩溃?怎么实现子函数“崩溃”?
“崩溃”:此时p=NULL;无法解引用;
子函数实现“p=NULL;”:viod Fun(int* *p)
{
*p=NULL;//修改父函数*p的
}
int main() { int a = 10; int *p = &a; //p = NULL; Fun(&p); printf("%d\n",*p); return 0; }
相关文章推荐
- C语言实现的线性表 函数形参:指针类型与变量类型的区别 (SqList *L)(SqList L)
- 通过void指针实现跨类型变量交换函数
- 用函数交换两个变量的值(C语言指针)
- 要求:不申请变量和空间 反转字符串 ,用一个函数实现。 异或^交换或者加减交换的典型应用! VIA 笔试题
- 函数和递归(组合数,孪生素数,用指针实现变量交换,求解二院一次方程组)
- C语言 使用函数实现两个数的交换
- c语言复杂变量声明(数组、指针、函数)
- 利用C语言来实现交换两个变量的值,由终端输入两个整数给变量x、y,然后交换x和y的值后,输出x和y。 有不同的方法
- 通过交换虚函数表指针查看虚函数的实现方式
- C语言结构体变量和结构体变量的指针作函数参数例题
- 编写函数实现对两个变量的值进行交换
- 应用:用函数实现两个变量值的交换
- C语言易错点(函数里修改传入变量的值不会改变传入变量的指针)
- 【面试题】C语言:使用函数实现两个数的交换
- C语言02 - 指针运算、数组与指针、指针变量名、指针与函数参数、指针函数、函数指针、二级指针
- Java中实现类似于C语言的中函数指针的功能
- 一.数组和指针的差别二.函数的好处以及使用函数的注意项。三.用c语言如何实现面向对象?c语言哪些点体现了面向对象。
- 【C语言】实现一个函数求字符串长度(不能创建第三方变量)
- 编写函数实现对两个变量的值进行交换
- C语言中利用位运算和指针实现的交换两个数的程序