zoukankan      html  css  js  c++  java
  • 指针与函数

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

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

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

    本文由作者原创,如需转载注明出处!
  • 相关阅读:
    通信收发单元
    WOSA协议(转)
    CcTalk (网络协议)(转)
    0x和H都表示十六进制有什么区别吗?
    select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
    &是什么运算符(转)
    NDK的Paths and Symbols设定
    android JNI调用(转)
    scrapy-redis基础和介绍
    scrapy-redis介绍(一)
  • 原文地址:https://www.cnblogs.com/Fsiswo/p/9290435.html
Copyright © 2011-2022 走看看