指针与函数

上述图片,表达了传值和传址的两种方式。但是这不是重点,重点是他们的过程和关系。

函数之间可以进行直接传值,但是过程又是怎么样的呢。

顺着代码下来,遇到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函数中,把结构体指针类型作为函数的返回类型,这样做的好处是,可以在其他函数内做参数,进行快速的传递,而且传的是指针。没有指针的话,就得先在函数里面声明一个性质一样的变量,然后再通过函数赋值给主函数的变量,多麻烦啊,且浪费内存,消耗太大了。这样我们需要传递结构体就会轻松很多。

本文由作者原创,如需转载注明出处!
原文地址:https://www.cnblogs.com/Fsiswo/p/9290435.html