实参与形参的不同
#include <stdio.h>
void swap(int * p, int * q)
{
int t;
t = *p;
*p = *q;
*q = *t;
}
int main()
{
int a = 3;
int b = 5;
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
形参与实参定义:
在main函数中变量a, b作为实参(相对于swap(int * q, int * p);),
q和p被称之为形参变量。
编译器为刚定义的变量分配空闲内存单元
即使我们不在程序中人为的为变量分配内存空间。编译器也会一旦发
现有变量被定义,编译器会自己找到一片空闲的内存单元给刚定义的
变量,而且会随机赋给变量一个垃圾值。
这样就导致,实参与形参本质的不同在于内存单元不同:
a有自己的内存单元,用于存放赋给整型变量的具体数值,而且这个内
存单元编号不同于b, p, q这三个变量的内存单元编号b有自己的内存单元,用于存放赋给整型变量的具体数值,而且这个内
存单元编号不同于a, p, q这三个变量的内存单元编号p有自己的内存单元, 用于存放整型变量内存单元编号这种数值,而且
这个内存单元编号不同于a, b, q这三个变量的内存单元编号q有自己的内存单元,用于存放整型变量内存单元编号这种数值,而且
这个内存单元编号不同于a, b, p这三个变量的内存单元编号
这也是导致要交换两个数的值,一旦封装成函数去实现的难度。
指针变量和*指针变量很好的解决了这个问题。
int * p;
int a = 3;
p = &a;
这个时候指针变量p:
p保存了a的地址。
p指向了a.
*p完全等同于a
或者更准确的说*p是以p的内容为地址的变量
理解这个程序关键是理解:
*p完全等同于a
或者更准确的说*p是以p的内容为地址的变量
p的内容就是a的地址(a的内存单元编号)
*p是以p的内容为地址的变量
更进一步可以说成是
*p是以a的内存单元编号为地址的变量。
而以a的内存单元编号为地址的变量,其实就是a自己。
这样就不难理解*p完全等同于a了。
那么同样的*q完全就等同于b了。
这样的话,我们做到了在main函数以外的函数(swap)中操纵main函数内
定义的a, b变量, 使其发生值的交换。这样的做法和在main函数体内,不用外部交换函数,通过编写交换变量的语句而直接交换a, b值功效一样。
不过你会觉得在main函数内能交换,干嘛非得写个外部函数去做,其实这点需要理解编写自定义函数的目的是为了解决这样的问题:
对一类具有相同功能的代码模块,可能被其函数反复,多次调用。
同样需要程序员多次编写相同重复的代码。这样的代码可以抽取独立成一个模块,自定义为一个函数。
这样做的好处是有利于函数的模块化。
这点和C语言程序设计的精神是一致的:
自顶向下,逐步细化,模块化。。。。