• C陷阱与缺陷 第3章 语义“陷阱” 3.3 作为参数的数组声明


    作为参数的数组声明
    在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) {
        /*具体内容*/ 
    }

    extern char *hello;
    这个语句与下面的语句有着天壤之别: 
    extern char hello[];
    如果一个指针参数并不实际代表一个数组,即使从技术上而言是正确的,采用数组形式的记法也经常会起到误导作用。如果一个指针参数代表一个数组,情况有时如何呢?一个常见的例子就是函数main的第二个参数: 
    int main(int argc, char *argv[]) {
        /*具体内容*/ 
    }
    这种写法与下面的写法完全等价: 
    int main(int argc, char **argv) {
        /*具体内容*/ 
    }
    需要注意的是,前一种写法强调的重点在于argv是一个指向某数组的起始元素的指针,该数组的元素为字符指针类型。因为这两种写法是等价的,所以读者可以任选一种最能清楚反映自己意图的写法。 

  • 相关阅读:
    双活架构设计-连接集群
    linux 学习笔记
    FastDFS简介及安装部署(CentOS7)
    VoIP之前向纠错(FEC)
    Elasticsearch中使用join来进行父子关联
    写给Python社群的第4课:字典和集合,又是一组新概念
    卧兔操刀,头部游戏公司莉莉丝出海,红人营销仅10天数据翻一倍
    1.HTML表格跨行、跨列操作
    nginx 日志处理goaccess、shell
    阿里出品,SpringBoot应用自动化部署神器,IDEA版Jenkins?
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/125876242