当前位置: 首页 > 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.mrgr.cn/news/93844.html

相关文章:

  • docker compose 以redis为例
  • CUDA编程入门代码
  • 《OkHttp:工作原理 拦截器链深度解析》
  • 泛型、泛型上限、泛型下限、泛型通配符
  • (更新完)LPZero: Language Model Zero-cost Proxy Search from Zero
  • 梯度计算中常用的矩阵微积分公式
  • How to install nacos 2.5 with podman
  • Java 大视界 -- Java 大数据在智能体育赛事运动员表现分析与训练优化中的应用(122)
  • ALG(Alloy+Loki+Grafana)轻量级日志系统
  • 华为eNSP:配置单区域OSPF
  • ​​《从事件冒泡到处理:前端事件系统的“隐形逻辑”》
  • Deepseek可以通过多种方式帮助CAD加速工作
  • Mybatis Generator 使用手册
  • DeepSeek私有化部署7:openEuler 24.03-LTS-SP1安装Open WebUI
  • MYSQL之创建数据库和表
  • 用Python写一个算24点的小程序
  • 【STM32】STM32系列产品以及新手入门的STM32F103
  • [总概]Vue2/3React Diff算法
  • 【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决)
  • FPGA时序约束的几种方法