9.C语言之指针(3)交换两个数的值(深度解析),形参和实参
·
此文章为指针系列的第3篇,如果觉得不错,可关注并收藏,后续会持续更新😜😜😜
目录
在了解这个内容之前,我们先要明白一个非常的重要的知识点,形参和实参
在了解这个内容之前,我们先要明白一个非常的重要的知识点,形参和实参
问题1:形参和实参是什么?
形参就是我们在定义函数时,小括号中写的参数
实参是我们调用函数时,传入的参数
形参和实参的个数必须相同,位置要一一对应,数据类型要兼容
问题2:形参和实参是不是一个变量?
不是,形参和实参永远不是一个变量
我们来验证实参和形参是不是一个变量
#include <iostream>
#include <stdio.h>
using namespace std;
void test(int i)
{
i = 99;
printf("形参i的地址为:%#X\n", &i);
}
int main(int argc, char const *argv[])
{
int i = 6;
printf("实参i的地址为%#X\n", &i);
test(i);
printf("经过test函数得到的i 为 %d\n", i);
return 0;
}
i通过函数test之后,i的值并没有发生改变,而且形参i和实参i的地址不同,这更加说明了实参和形参不是一个变量。
经典程序,通过函数交换两个数的值
方法1:通过中间变量交换
void exchange(int a, int b)
{
int t;//定义中间变量
t = a;
a = b;
b = temp;
}
int main(int argc, char const *argv[])
{
int a = 3;
int b = 5;
exchange(a, b);
printf("----------------------\n");
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
这种方法不行,实参将a=3,b=5传入到形参a,b中,仅仅交换了形参,函数运行完空间释放,实参a和b的值还是原来的值,因为实参和形参不是一个变量
方法2:通过改变形参的指针方向来交换
void exchange_2(int *p, int *q)
{
int *t;//定义中间指针变量t
t = p;
p = q;
q = t;
}
int main(int argc, char const *argv[])
{
int a = 3;
int b = 5;
exchange_2(&a, &b);//传入a和b的地址
printf("----------------------\n");
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
方法2不可以,因为这种方法
虽然传入的是a和b的地址(指针),即p保存了a的地址,q保存b的地址,但是改变的只是p和q的指向
改变前:
改变后:
虽然改变的是p,q的指向,但是我们输出的还是a和b
方法3:通过地址去改变
void exchange_3(int *p, int *q)
{
int t;
//如果要互换*p和*q的值,则t必须定义为int,不能定义成int*,否则语法错误
t = *p; //p的数据类型是int*,*p的数据类型是int
*p = *q;
*q = t;
}
int main(int argc, char const *argv[])
{
int a = 3;
int b = 5;
exchange_3(&a, &b);
printf("----------------------\n");
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
方法3可行
传入了a,b的地址,p和q中存放着a,b的地址,*p就是实参a,*q就是实参b,交换*p和*q就等于交换了a和b。换句话说,就是通过地址去找到a和b然后改他们的值。
改变前:
改变后:
总结:
1.形参和实参永远不会是一个变量
2.要想通过函数互换两个数的值,就是通过地址去更改。要将要改的数的地址作为参数传入
3.当写了p = &a; 这句话后,p存放的就是a的地址,*p就是a
4.更改过后,a,b的地址也不会发生改变
更多推荐
已为社区贡献2条内容
所有评论(0)