当前位置: 首页 > news >正文

c语言笔记 函数参数的等价(下)

为什么这三种写法是等价的?

    这三种写法是等价的,数组在作为函数参数的时候会变成指针,数组的大小会被系统编译器自动忽略
所以char *(argv[argc]) 等价于 char *(argv[]) 
*和[]是可以相互转换的所以char *(argv[])等价 char *(*argv)

作为命令行:这里我们需要的是一个指针数组,其实上面的理解都可以理解成一个指针数组,因为指针数组
与char型的二维数组好搭配
int *p[5] = {指针,指针,指针...} 变量的类型 int *[5]  数组的元素类型:int * --->指针
char *(argv[argc])    char *(argv[])   char *(*argv)
上面三种写法只有在作为函数参数的时候是等价的,如果是在函数内定义的那么它们就是不一样的

  1. char *(argv[argc])

    • 这种写法声明argv是一个数组,其大小为argc,每个元素是一个指向char的指针。

    • 在函数参数中,数组的大小argc实际上会被编译器忽略,因为数组作为参数传递时会退化为指针。

  2. char *(argv[])

    • 这种写法声明argv是一个数组,但没有指定数组的大小。

    • 在函数参数中,未指定大小的数组会被编译器视为一个指针。

  3. char **argv

    • 这种写法直接声明argv是一个指向char *的指针,即二级指针。

        在C语言中,当数组作为函数参数传递时,它会退化为指向其首元素的指针。这意味着,无论你如何声明数组参数(无论是指定大小还是不指定大小),编译器最终都会将其视为一个指针。因此,char *(argv[argc])char *(argv[])在语义上等价于char **argv

代码示例

以下是一个简单的示例,展示这三种声明方式的等价性:

#include <stdio.h>

// 使用 char *(argv[argc])
void printArguments(int argc, char *(argv[argc])) {
    for (int i = 0; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
}

// 使用 char *(argv[])
void printArguments2(int argc, char *(argv[])) {
    for (int i = 0; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
}

// 使用 char **argv
void printArguments3(int argc, char **argv) {
    for (int i = 0; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
}

int main() {
    char *arguments[] = {"arg0", "arg1", "arg2"};
    int argCount = sizeof(arguments) / sizeof(arguments[0]);

    printArguments(argCount, arguments);
    printArguments2(argCount, arguments);
    printArguments3(argCount, arguments);

    return 0;
}

        在这段代码中,printArgumentsprintArguments2printArguments3三个函数的参数声明方式不同,但它们的功能和行为完全相同。

总结

  • 数组参数的退化:数组作为函数参数时会退化为指向其首元素的指针。
  • 解引用和下标操作的等价性:在C语言中,*(ptr + i)ptr[i]是等价的。
  • 数组大小在参数声明中被忽略:在函数参数中声明数组时,数组的大小会被编译器忽略。

相关文章:

  • 华为eNSP:2.配置OSPF报文分析和验证
  • Redis 发布订阅模式详解:实现高效的消息通信
  • Redis未授权访问
  • AI-NAS:当存储遇上智能,开启数据管理新纪元
  • 【工控】线扫相机小结 第五篇
  • 开源模型时代的 AI 开发革命:Dify 技术深度解析
  • SpringMVC项目中,涉及到的各种请求
  • 店匠科技携手 PayPal 升级支付体验,助力独立站商家实现全球增长
  • 重邮数字信号处理-实验五时域采样与频域采样
  • 数据结构(蓝桥杯常考点)
  • 我的AI工具箱Tauri版-建筑平面图生成装修设计
  • Flutter:StatelessWidget vs StatefulWidget 深度解析
  • 如何修复“RPC 服务器不可用”错误
  • 第三章 数据结构基础
  • 云原生周刊:Istio 1.25.0 正式发布
  • PPT内视频播放无法播放的原因及解决办法
  • Maven Deploy Plugin如何使用?
  • c++介绍锁 一
  • STM32基础教程--旋转编码器计数实验
  • 一文了解汽车图像传感器
  • 门户网站 建设/怎么知道自己的域名
  • 招应届培训网页设计/云南seo网站关键词优化软件
  • 上海网站建设费用多少/国际新闻快报
  • 交通运输局网站建设方案/seo外链推广平台
  • 广州微型网站建设/百度问答平台
  • 成都 做网站 模版/营销推广软文案例