#include <stdio.h>
void swap_1(int x, int y)
{
int t;
t = x;
x = y;
y = t;
}
int main()
{
int x=3, y=4;
swap_1(x,y);
printf("x=%d, y=%d\n",x,y);
return 0;
}
那么究竟为什么没能实现两个数交换呢?
其中要注意的是main函数中调用swap_1函数,其中括号填的是实参(可以理解为用户输入的参数)
而第二行中的swap_1 中的参数为形参(顾名思义形式参数)而在本程序中形参为局部变量,实参为全局变量
即使形参和实参的名字一样,但是是不同的东西
因为在运行过程中调用函数后系统会给形参分配新的存储单元,但在执行完函数之后
此函数是没有返回值的,故在swap_1函数中 x 与 y 的值确实的得到了交换
但是函数执行完后(形参)x 与 y 的存储单元就被释放,故最后的结果相当于没有交换。
主要是因为,在swap_1函数中完成交换的两个数之后存储单元被释放
(当然有返回值的话可以实现,但现在讨论的是没有返回值)
(因此要用一种工具,在函数没有返回值的情况下能把已交换的值在存储单元被释放前带到主函数main中)
(那么我们应该考虑的是改变其地址,就是变量所指的地址)
从而完成数字的交换。
那么 C程序的灵魂 —— 指针能够帮到我们!
#include <stdio.h>
void swap_1(int *p, int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
int main()
{
int x=3, y=4;
swap_1(&x,&y);
printf("x=%d, y=%d\n",x,y);
return 0;
}
通过指针能改变两个变量的值~
#附注:
* 的几个含义(用法):
1. 作为乘法的运算符
2. 用来定义指针变量 例如: int *p;
p 为变量名字,int * 为数据类型表明变量p只能存放int类型数据的地址
3.指针(运算符)
用在已定义好的指针变量前面,比如2中的p为已经定义好的指针变量。
如果 p 为一个已定义好的指针变量
则 *p 表示为以 p 的内容为地址的变量(可以说是一个值,像2中就是一个int类型的值)