zoukankan      html  css  js  c++  java
  • c实参传递给形参

    1. viod GetMemory(char*p,int num) 
    2. { 
    3.      p=(char*)malloc(sizeof(char)*num); 
    4. } 
    5.  
    6. voidTest(void) 
    7. { 
    8.      char*str=NULL; 
    9.      GetMemory(str,100);//str仍为NULL 
    10.      strcpy(str,"hello");//运行出错 
    11. }

    无论函数参数是什么类型,都是按照传递一份拷贝进去的,就算是指针也是一样。本例中,GetMemory(str,100)这句话,实际上传递的也是str指针的值null进去。所以其实GetMemory(char *p, int num)中的p指针实际上是一个临时变量(一个在别的内存位置的变量),只是存储了和str一样的值而已。所以在函数中改变的指针p的值只是改变了函数参数中临时变量的值,与str实际上是一点关系都没有,str还是null
    那么传指针究竟是什么作用呢?虽然指针的值也是一份拷贝进去的,但是由于拷贝的值的特殊性,因为指针的值实际上就是一个地址,那么在调用函数的内部,可以通过传递进来的临时指针变量的值引用指针所指向的内存空间,从而改变所指向空间的值
    所以,传递指针参数,不能改变指针所指向的地址,只能改变指针所指向地址的空间的值。

    要使用指针的指针才行,也就是二级指针:

      
    1. viod GetMemory(char**p,int num) 
    2. { 
    3.      *p=(char*)malloc(sizeof(char)*num); 
    4. } 
    5.  
    6. voidTest(void) 
    7. { 
    8.      char*str=NULL; 
    9.      GetMemory(&str,100); 
    10.      strcpy(str,"hello"); 
    11. }

    我们可以用函数返回值来传递动态内存。这种方法更加简单

    char *GetMemory3(int num)
    {
    char *p = (char *)malloc(sizeof(char) * num);
    return p;
    }
    void Test3(void)
    {
    char *str = NULL;
    str = GetMemory3(100);
    strcpy(str, "hello");
    cout<< str << endl;
    free(str);
    }

  • 相关阅读:
    dijkstra算法模板 -- 最短路
    0-1背包
    POJ 1456-Supermarket(贪心+并查集)
    CodeForces 556C
    CodeForces
    POJ 2253-Frogger(Floyd变形)
    POJ 1251-Jungle Roads(最小生成树)
    HDU 1846-Brave Game(巴什博弈)
    HDU 1233-还是畅通工程(经典最小生成树)
    51Nod 1649-齐头并进(最短路dijkstra)
  • 原文地址:https://www.cnblogs.com/encode/p/3344560.html
Copyright © 2011-2022 走看看