zoukankan      html  css  js  c++  java
  • c的传值和传址

    在c语言中,常常会遇到这样的问题

    例子1:

    void getMem(int *a)

    {

      a = (int *)malloc(sizeof(int));

    }

    int main()

    {

      int *arr, b = 5;

      arr = &b;

      getMem(arr);

      return 0;

    }

    结果会发现,内存确实申请了,但是arr没有指过去,什么原因呢?

    我觉得可以总结一句话:在函数传参数过程中,传过去的变量不可以被改变,改变的只是变量的副本,上述例子中传过去int *a, 实际上还是a,a的值不可改变,在swap(int a, int b)中也是一样的

    例子2:

    #include <stdio.h>
    #include <malloc.h>
    typedef struct node
    {
      int a;
      struct node *next;
    };

    void getAddress(node *a)
    {
      node *s, *b;
      b = a;
      s = (node *)malloc(sizeof(node));
      s->a = 10;
      s->next = NULL;

      b->next = s;

    }
    void getAddress1(node *a)
    {
      node *s;

      s = (node *)malloc(sizeof(node));
      s->a = 10;
      s->next = NULL;

      a->next = s;
    }

    void getAddress2(node *a)
    {
      a->next = (node *)malloc(sizeof(node));
      a->next->a = 10;
    }

    void Init(node **a)
    {
      *a = (node *)malloc(sizeof(node));
      (*a)->a = 5;
      (*a)->next = NULL;
    }

    int main()
    {
      node *arr;
      Init(&arr);
      printf("arr->next :%p ", arr->next);
      getAddress3(arr);
      printf("arr->next1 :%p ", arr->next);
      printf("arr->a: %d ", arr->a);
      printf("arr->next->a: %d ", arr->next->a);


      return 0;
    }

    在这个例子中,在Init(node **a)使用双重指针是因为我们要给main函数中的arr申请空间,让它指向一块申请出来的地址,如果使用单指针的话,就如例子1,它是不能改变arr的值的,a指向的是arr,

    已就是a中存的是arr的地址,*a存的才是arr的内容;

    至于函数getAddress()和getAddress1()还有getAddress2()的作用是一样的

  • 相关阅读:
    常用方法 反射常见方法
    常用方法 字符串是否是中文
    常用方法 读取 Excel的单位格 为 日期格式 的数据
    常用方法 保证数据长度相同
    常用方法 简单缓存
    P1821 [USACO07FEB]银牛派对Silver Cow Party
    P3905 道路重建
    关于宏定义
    P3512 [POI2010]PIL-Pilots
    P2398 GCD SUM
  • 原文地址:https://www.cnblogs.com/fangrong/p/6762971.html
Copyright © 2011-2022 走看看