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

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

这三种写法在 C 语言中是等价的,因为它们都用于声明一个指向二维数组的指针,或者用于声明一个二维数组作为函数参数。它们的等价性源于 C 语言中数组和指针之间的密切关系。让我们逐一分析这三种写法:

        在C语言中,当数组作为函数参数时,第一维的大小会被忽略,因为数组会被转换为指针。也就是说,无论你写的是'a[m]'还是'a[]',编译器都会将其视为指针。因此,这里的m可能实际上并不影响参数的传递方式,可能只是一个提示,但编译器会忽略它。所以这个写法实际上会被视为指向一维数组的指针。也就是数组指针。

1. void show(int m, int n, int (a[m])[n])这种写法明确指定了

        a 是一个指向二维数组的指针,其中第一维的大小是 m,第二维的大小是 n。这种写法在函数参数中非常常见,用于传递一个二维数组。

2. void show(int m, int n, int (a[])[n])

        这种写法与第一种写法等价,只不过第一维的大小被省略了。在 C 语言中,当数组作为函数参数传递时,第一维的大小可以省略,因为编译器只需要知道第二维的大小来计算数组元素的地址。

3. void show(int m, int n, int (*a)[n])这种写法使用指针表示法,明确指定了

        a 是一个指向包含 n 个 int 类型元素的数组的指针。这种写法与前两种写法在功能上是等价的,只是语法上有所不同。

为什么它们是等价的?

这三种写法在内存布局和访问方式上是相同的,它们都表示一个二维数组,其中第二维的大小是 n编译器在处理这些声明时,会将它们视为相同的数据结构,因此它们是等价的。

示例代码

以下是一个示例代码,展示了这三种写法的等价性:

#include <stdio.h>

// 第一种写法
void show1(int m, int n, int (a[m])[n]) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

// 第二种写法
void show2(int m, int n, int (a[])[n]) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

// 第三种写法
void show3(int m, int n, int (*a)[n]) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int m = 2;
    int n = 3;
    int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

    printf("show1:\n");
    show1(m, n, a);

    printf("show2:\n");
    show2(m, n, a);

    printf("show3:\n");
    show3(m, n, a);

    return 0;
}

输出结果

运行这段代码将输出:

show1:
1 2 3 
4 5 6 
show2:
1 2 3 
4 5 6 
show3:
1 2 3 
4 5 6 

总结

这三种写法在功能上是等价的,它们都用于声明一个指向二维数组的指针或传递一个二维数组作为函数参数。选择哪种写法取决于个人偏好和代码的可读性。

http://www.dtcms.com/a/60032.html

相关文章:

  • redis数据迁移教程(使用RedisShake实现不停机迁移十分便捷)
  • liunx学习(四)(文本处理(stdout stderr,Cut,paste,sort,tr,head,Tail,join,Split,grep,...))
  • OSI模型
  • 使用 QML 和 QtSql 实现 SQLite 数据库操作
  • FPGA基础 -- Verilog常用关键字
  • langChainv0.3学习笔记(初级篇)
  • mysql创建数据库和表
  • 【网络安全工程】任务11:路由器配置与静态路由配置
  • 锐势信息的面试
  • systemtap学习笔记
  • Zama TFHE-rs v1.0 发布
  • 系统部署【信创名录】及其查询地址
  • MySql的安装及数据库的基本操作命令
  • 【五.LangChain技术与应用】【12.LangChain语言模型介绍:AI语言处理的核心技术】
  • Unity网络开发基础 (2) 网络协议基础
  • 【VUE2】第三期——样式冲突、组件通信、异步更新、自定义指令、插槽
  • C语言学习day25:WinAPI编程进阶06-游戏辅助窗体监视热键讲解
  • Linux 4.4 内核源码的目录结构及其主要内容的介绍
  • go context学习
  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(10)
  • maven的配置文件settings.xml
  • 深度学习实战车道线检测
  • Linux——在 .sh 文件中实现 并行执行 的方法
  • C++ 数据结构
  • 在Linux开发板中使用.NET实现音频开发
  • VM4.4 获取自己的路径
  • 教务考试管理系统-Sprintboot vue
  • OpenAI Whisper:开启语音转文本的智能时代
  • React
  • <建模软件安装教程1>Blender4.2系列