IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C陷阱与缺陷之作为参数的数组声明

    TacuLee发表于 2015-12-26 06:51:21
    love 0

    在C语言中,我们没有办法可以将一个数组作函数参数直接传递。如果我们使用数组名作为参数,那么数组名会立刻被转换为指向该数组第1个元素的指针。例如,下面的语句:

    char hello[] = “hello”;

    声明了hello是一个字符数组。如果将数组作为参数传递给一个函数,

    printf(“%s\n”, hello);

    实际上与将数组第1个元素的地址作为参数传递给函数的作用完全等效,即:

    printf(“%s\n”, &hello[0]);

    因此,将数组作为函数参数毫无意义。所以,C语言中会自动地将参数的数组转换为相应的指针声明。也就是说,像这样的写法:

    int strlen(char s[])
    {
    /*具体内容*/
    }

    与下面的写法完全相同:

    int strlen(char* s)
    {
    /*具体内容*/
    }

    C程序员经常错误地假设,在其他情形下也会有这种自动地转换。本书4.5节详细地讨论一个具体的例子,程序员经常在此处遇到麻烦。

    extern char *hello;

    这个语句与下面的语句有着天渊之别:

    extern char hello[];

    如果一个指针参数并不实际代表一个数组,即使从技术上而言正确的,采用数组形式的记法经常会起到误导作用。如果一个指针参数代表一个数组,情况又是如何?一个常见的例子就是main的第二个参数:

    main(int argc, char* argv[])
    {
    /*具体内容*/
    }

    这种写法与下面的写法完全等价:

    main(int argc, char ** argv)
    {
    /*具体内容*/
    }

    需要注意的是,前一种写法强调的重点在于argv是一个指向某数组的起始元素指针,该数组的元素为字符指针类型。因为这两种写法是等价的,所以读者可以任选一种最能清楚反映自己意图的写法。

    未经允许不得转载:TacuLee » C陷阱与缺陷之作为参数的数组声明



沪ICP备19023445号-2号
友情链接