zoukankan      html  css  js  c++  java
  • C语言指针及数组(Q&A)

    龙猫公交车 http://home.cnblogs.com/233971/ 在我前一篇《c语言指针与数组》http://www.cnblogs.com/lua5/archive/2010/12

    代码
    void clear_string(char *str)
    {
    str
    = NULL;
    }

    void get_string(char *str)
    {
    char ch;
    int i;
    for(i = 0; i < 3; i++) {
    ch
    = getchar();
    if (ch == '\n')
    return;
    str[i]
    = ch;
    }
    }

    int main(void)
    {
    char string[4] = {'\0'};

    get_string(
    string);
    printf(
    "Before clear, string:%s\n", string);
    clear_string(
    string);
    printf(
    "After clear, string:%s\n", string);
    return 0;
    }

    首先说这段代码的问题,为何clear_string不生效,龙猫的理解其实是不对的。对于main函数中的string变量以及clear_string中的str,它们指向同一个地址,由于所指定的类型也是一样的,基本可以认为它们就是一回事,只是要时刻牢记我们调用clear_string(string);,实际上是把string第一个元素起始地址作为参数传入。

    要记住一个原则:C语言中,任何函数想修改传入的值,然后返回给调用方,一定是类似这样的 *pOut = value;

    这个原则非常非常重要。

    回到clear_string()这个函数,str = NULL;是什么效果呢?这意味着我们从这一行开始,到有效地block结束(对当前函数而言block结束就是函数结尾)或者下一个对str的赋值之前,我们把str赋值为NULL。注意我们修改的是str的值,相当于把str重新指向NULL这个地址。在这里,str是作为函数的局部变量使用,不影响调用方传入的值,这就好比这样一个函数原型

    void SetZero(int iVal)

    {

      iVal = 0;

    }

    任何一个稍有C语言基础的朋友都知道,当我们这样调用int iValCaller = 5; SetZero(iValCaller);运行以后,iValCaller的值依然是5。可以这样认为,程序运行调用SetZero函数的时候,把参数iVal在程序运行栈上做了一份拷贝(copy)传递给函数,函数SetZero对拷贝(copy)做的修改不会影响到调用方变量。

    如果想影响母体,只有一种方式,就是把调用方变量的地址传递给函数,这时候通过指针就可以间接操作调用方变量值了,这也是指针的最大功用。

    知道了问题,修改就很容易了,下面的写法才是指针型变量最常用的代码片段:

    void clear_string(char *str){  *str = NULL; }

    如果我想修改str,比如某个函数负责申请一块内存返回,这时候我们修改的是指针地址(&p)的值,那么就要传入需要指针的指针。

    void AllocBuffer(char** ppBuf, int size)

    {

      *ppBuf = malloc(size);

    }

    注意,其实质还是*p = value;这种模式。

  • 相关阅读:
    Angular 一个简单的指令实现 阻止事件扩散
    怎样group by一列 select多列
    Angular Viewchild undefined
    TypeScript扩展类方法
    vmware station-ubuntu18.04 共享剪贴板
    基于R统计软件的三次样条和平滑样条模型数据拟合及预测
    R语言析因设计分析:线性模型中的对比
    R语言逻辑回归、方差分析&#160;、伪R平方分析
    R语言多重比较方法
    R语言逐步多元回归模型分析长鼻鱼密度影响因素
  • 原文地址:https://www.cnblogs.com/lua5/p/1901245.html
Copyright © 2011-2022 走看看