当前位置: 首页 > 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 

总结

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

相关文章:

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

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

hive面试题--left join的坑

student 表&#xff1a; 课程表course: 1、key为null, 不关联 select * from student s left join course c on s.id c.s_id;2、on中过滤条件 与 where 过滤条件区别 on and c.id<>‘1001’ 先过滤右表数据&#xff0c;然后与左表关联 select * from student s le…...

CEH与OSCP:网络安全认证对比分析

在网络安全领域&#xff0c;渗透测试被视为至关重要的一环&#xff0c;帮助企业检测和修复系统漏洞。为提升行业标准&#xff0c;许多认证应运而生&#xff0c;其中CEH和OSCP作为行业认可度较高的认证&#xff0c;广泛被网络安全从业者选择。尽管这两者都涉及渗透测试领域&…...

HTML 属性详解:为网页元素赋予更多功能

在构建网页的过程中&#xff0c;HTML 是基础的标记语言&#xff0c;而 HTML 属性则是为 HTML 元素提供附加信息的重要组成部分。 一、属性的基本概念与使用 属性通常出现在 HTML 标签的开始标签内&#xff0c;以 “name"value"” 的形式存在。这里的 “name” 是属…...

Ceph(2):Ceph简介

1 Ceph简介 Ceph使用C语言开发&#xff0c;遵循LGPL协议开源。Sage Weil(Ceph论文发表者)于2011年创立了以Inktank公司主导Ceph的开发和社区维护。2014年Redhat收购inktank公司&#xff0c;并发布Inktank Ceph企业版&#xff08;ICE&#xff09;软件&#xff0c;业务场景聚焦云…...

国产编辑器EverEdit - 设置文件类型关联为EverEdit

1 设置-文件关联 1.1 应用场景 文件关联是指在文件管理器中双击某类型的文件&#xff0c;操作系统自动调用可以打开该文件的应用程序&#xff0c;比如&#xff1a;用户双击XXXX.txt文件&#xff0c;系统默认会使用记事本打开该文件。   由于各行各业都会定义特有的文件类型&…...

2025网络安全工程师:软考新挑战与职业发展探析

网络安全工程师的崛起 随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;网络安全工程师这一职业逐渐受到社会各界的广泛关注。特别是在2025年&#xff0c;随着各项网络安全法规的完善和实施&#xff0c;网络安全工程师的角色愈发重要。他们不仅是企业信息…...

设计模式之建造者模式:原理、实现与应用

引言 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过将复杂对象的构建过程分解为多个简单的步骤&#xff0c;使得对象的创建更加灵活和可维护。建造者模式特别适用于构建具有多个组成部分的复杂对象。本文将深入探讨建造者模式的原…...

【Leetcode 每日一题 - 补卡】2070. 每一个查询的最大美丽值

问题背景 给你一个二维整数数组 i t e m s items items&#xff0c;其中 i t e m s [ i ] [ p r i c e i , b e a u t y i ] items[i] [price_i, beauty_i] items[i][pricei​,beautyi​] 分别表示每一个物品的 价格 和 美丽值 。 同时给你一个下标从 0 0 0 开始的整数数…...

雪藏HsFreezer(游戏冻结工具) v2.21

HsFreezer 是一款让你可以随心冻结游戏的软件(游戏暂停软件、系统优化软件、进程管理软件),想玩就玩,想停就停,快捷键随心瞬发,单锁模式极致的丝滑切换,当然,不止适用游戏。更有丰富的特色系统优化功能。 PC主机,win掌机,笔记本--无脑装就对了,超大按键超大列表,触控盲操,非常巴…...

2019年蓝桥杯第十届CC++大学B组真题及代码

目录 1A&#xff1a;组队&#xff08;填空5分_手算&#xff09; 2B&#xff1a;年号字符&#xff08;填空5分_进制&#xff09; 3C&#xff1a;数列求值&#xff08;填空10分_枚举&#xff09; 4D&#xff1a;数的分解&#xff08;填空10分&#xff09; 5E&#xff1a;迷宫…...

前端安全面试题汇总及参考答案

目录 简述 XSS 攻击的原理及三种常见类型(存储型、反射型、DOM 型) 如何在前端防御 XSS 攻击?列举编码、过滤、CSP 策略的具体实现方式 富文本编辑器场景下如何安全处理用户输入的 HTML 内容? 如何通过 HttpOnly 属性增强 Cookie 安全性?它与 XSS 防御的关系是什么? …...

修复ubuntu下找不到音频设备的问题

出现问题的状态&#xff1a; ALSA 已正确识别到 ZOOM H2n 设备&#xff08;card 1&#xff09;sounddevice 库&#xff08;依赖 PortAudio&#xff09;未能正确枚举设备 修复方法&#xff1a; 1. 强制 sounddevice 使用 ALSA 后端 默认情况下&#xff0c;sounddevice 可能尝…...

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐ 示例 1&#xff1a; 输入&#xff1a;original [1,2,3,4], bounds [[1,2],[2,3],[3,4],[4,5]] 输出&#xff1a;2 解释&#xff1a; 可能的数组为&#xff1a; [1, 2, 3, 4] [2, 3, 4, 5] 示例 2&#xff1a; 输入&…...

在线json转ArkTs-harmonyos

轻松将 JSON 数据转换为类型安全的 ArkTs 接口。快速准确地生成代码&#xff0c;提升开发效率&#xff0c;告别手动编写&#xff0c;让您的开发流程更加流畅&#xff01; gotool...

Vue 实现AI对话和AI绘图(AIGC)人工智能

我司是主要是负责AIGC人工智能化平台的项目&#xff0c;俗称内容创作及智能工具平台。 授人以鱼不如授人以渔 首先我们要明白AIGC中前端需要做什么 会用到哪些技术栈 。 AIGC前端需要用到的技术栈:Vue&#xff0c;Markdown&#xff0c;SSE。就这个三件套。 前沿:有人觉得AI对…...

Visual Studio Code 基本使用指南

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费、开源、跨平台的代码编辑器&#xff0c;凭借其轻量级设计、丰富的插件生态和强大的功能&#xff0c;成为全球开发者的首选工具。本文将从安装配置到核心功能&#xff0c;全面解析 VSCode 的基本使…...

水下机器人推进器PID参数整定与MATLAB仿真

水下机器人推进器PID参数整定与MATLAB仿真 1. PID控制原理 目标:通过调节比例(P)、积分(I)、微分(D)参数,使推进器输出力快速稳定跟踪期望值。传递函数(示例):推进器动力学模型可简化为: [ G(s) = \frac{K}{\tau s + 1} \cdot e^{-Ts} ] 其中:K为增益,τ为时间常…...

网络安全工具nc(NetCat)

NetCat是一个非常简单的Unix工具&#xff0c;可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end)工具&#xff0c;能被其它的程序程序或脚本直接地或容易地驱动。同时&#xff0c;它又是一个功能丰富的 网络调试和开发工具&#xff0c;因为它…...

【C/C++】如何求出类对象的大小----类结构中的内存对齐

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 通过本章你能具体的了解到&#xff0c;如何计算出一个类的大小&#xff0c;并且了解其中到底是如何算的以及了解到为什么需要内存对齐这种算&#xff0…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...