上述图片,表达了传值和传址的两种方式。但是这不是重点,重点是他们的过程和关系。
函数之间可以进行直接传值,但是过程又是怎么样的呢。
顺着代码下来,遇到a函数,进入a函数,在进入之前,函数a中克隆一个与aa相同的值的变量a,然后把1赋值给a。但是这个克隆变量a它的声明周期只存在于函数a。当退出函数a的时候,克隆变量a被销毁,主函数中的变量aa没有受到丝毫影响,因此输出的还是0.
同理进入函数b的时候,克隆的一个存有指向aa的指针变量b,虽然它的生命周期也是在函数b内。但是b存有aa的地址。我们可以把aa的源地址与克隆地址当作指向同一地方的两个指针。通过取值符 * 对变量a操作,就算出了函数b之后,变量b会被销毁,但是主函数中的变量已经被改变了。而不是像传值一样简单的在克隆变量上操作。
传值和传址就到这里,下面还有更好玩的东西
1 #include <stdio.h> 2 3 typedef struct time{ 4 int year; 5 int month; 6 int day; 7 }T; 8 9 struct time* a(T *today); 10 void b(T today); 11 12 int main(void){ 13 14 T today = {today.year=2018,today.month=7,10}; 15 a(&today); 16 b(*a(&today)); 17 18 return 0; 19 } 20 21 struct time* a(T *today){ 22 return today; 23 } 24 25 void b(T today){ 26 printf("%d %d %d ",today.year,today.month,today.day); 27 }
函数之间的间接访问只能通过指针,在a函数中,把结构体指针类型作为函数的返回类型,这样做的好处是,可以在其他函数内做参数,进行快速的传递,而且传的是指针。没有指针的话,就得先在函数里面声明一个性质一样的变量,然后再通过函数赋值给主函数的变量,多麻烦啊,且浪费内存,消耗太大了。这样我们需要传递结构体就会轻松很多。