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

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.kler.cn/a/581397.html

相关文章:

  • Jmeter下载安装配置及使用
  • 痉挛性斜颈护理:全方位呵护,重燃生活希望
  • Python 逆向工程:2025 年能破解什么?
  • Ajax-入门、axios请求方式、async、await、Vue生命周期
  • doris:阿里云 MaxCompute
  • 力扣刷题——2563.统计公平数对的数目
  • STM32 ——系统架构
  • Python CATIA二次开发实战:CATIA工程图批量导出DWG/PDF技术解析
  • pyCharm快速安装tensorflow、keras环境
  • Python Flask 开发用于访问数据库的 REST API
  • 《UE5_C++多人TPS完整教程》学习笔记34 ——《P35 网络角色(Network Role)》
  • 解决 word 2016 粘贴图片老是乱飘的问题
  • JAVA面试_进阶部分_java中四种引用类型(对象的强、软、弱和虚引用)
  • 深入探索Matter协议:开发Matter智能家居设备的基本步骤
  • Kubernetes Pod 生命周期详解 之 探针
  • 常用的gpt
  • 【性能测试】Jmeter如何做一份测试报告(3)
  • 第十五届蓝桥杯大学B组(握手问题、小球反弹、好数)
  • K8S学习之基础二十二:k8s的持久化存储之hostPath
  • 通义万相 2.1 + 蓝耘算力,AI 视频生成的梦幻组合