C 中将数组和数组指针传递给函数的区别

2023-12-06

C 中的两个函数有什么区别?

void f1(double a[]) {
   //...
}

void f2(double *a) {
   //...
}

如果我要在一个相当长的数组上调用这些函数,这两个函数的行为是否会有所不同,它们会在堆栈上占用更多空间吗?


首先,一些标准语:

6.7.5.3 Function declarators (including prototypes)
...
7 A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation. If the keyword static also appears within the [ and ] of the array type derivation, then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression.

因此,简而言之,任何声明为的函数参数T a[] or T a[N]被治疗好像它被宣布了T *a.

那么,为什么数组参数被视为被声明为指针呢?原因如下:

6.3.2.1 Lvalues, arrays, and function designators
...
3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

给出以下代码:

int main(void)
{
  int arr[10];
  foo(arr);
  ...
}

在通话中foo, 数组表达式arr不是其中任何一个的操作数sizeof or &,因此它的类型是从“ 10 元素数组int“到”指针int“根据 6.2.3.1/3。因此,foo将接收一个指针值,而不是一个数组值。

因为6.7.5.3/7,你可以写foo as

void foo(int a[]) // or int a[10]
{
  ...
}

但它会被解释为

void foo(int *a)
{
  ...
}

因此,这两种形式是相同的。

6.7.5.3/7 中的最后一句是在 C99 中引入的,基本上意味着如果你有一个像这样的参数声明

void foo(int a[static 10])
{
  ...
}

实际参数对应a必须是一个数组at least10 个元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中将数组和数组指针传递给函数的区别 的相关文章

  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • AngularJS:在没有工厂、服务或广播的情况下将数据从控制器传递到控制器?

    我不想使用服务或工厂 并且想传递例如数据数组 我想从子组件访问父控制器中的数据 工厂和服务被排除在外 因为我最终想将我的应用程序迁移到 Angular 2 并且我不想使用 ngclick 它似乎与广播 向上 打开密不可分 如果有人知道如何使
  • 更新到 jQuery 1.9.1 后 browser.msie 错误

    我使用以下脚本片段 if browser msie browser version lt 9 extra Math floor Math random 3000 它可以很好地与jQuery 1 8 3 现在我将 jQuery 更新到了新版本
  • 我如何在反应本机中以编程方式发送短信? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我是反应原生的新手 我想在我的 Android 应用程序中添加一个用于发送短信的组件 并且我尝试了几种不同的组件 但每次我都会遇到一些错误 这里有人成功完成此操作吗 请帮我 这是我遇到
  • 将行号添加到文件[重复]

    这个问题在这里已经有答案了 我需要将行号写入 python 3 中已有的文本文件 他们要求文本文件的前 5 列包含 4 位行号 后跟一个空格 我尝试通过创建一个 for 循环来读取行并将数字 1 添加到行的开头 然后增加下一行的数字 但一直
  • .pointsToMatrix(p1) 中的错误:纬度 > 90

    我正在尝试使用 R 中的 geosphere 包中的 distVincentyEllipsoid 函数来计算数据框中不同点之间的距离 遵循以下给出的示例根据纬度 经度向量计算行驶的总英里数 但是 我不断收到错误 pointsToMatrix
  • 使用 PHP 代码示例时,“webViewLink”为空/null

    使用 Google 最新版本的 PHP api 0 60 代码示例来自谷歌开发者页面似乎可以工作 除了在函数末尾使用 print r createdFile 时 webViewLink 字段为空 空之外 我的 Google Apps 域的d
  • 使用 PHP 代码的 Sharepoint 网站

    我意识到 Sharepoint 基于 asp net 但我有一个 PHP 应用程序 用户希望我将其包含在 Sharepoint 站点中 那么可以在sharepoint中使用PHP代码吗 danit 当您在网站中说 包含 时 这是否意味着成为
  • 理解“||” Ruby 中 If 条件中的 OR 运算符

    简而言之 为什么以下三行的效果不相同 if controller controller name projects controller controller name parts if controller controller name
  • 现实世界中的 C++ std::vector 与数组

    我是 C 新手 我正在阅读 Michael Dawson 的 通过游戏编程开始 C 不过 总的来说 我对编程并不陌生 我刚刚完成了关于向量的一章 所以我有一个关于它们在现实世界中的使用的问题 我是一名计算机科学专业的学生 所以我还没有太多的
  • 使用 for 循环对所有列同时进行 Wilcoxon 检验和 t 检验

    我有一个包含很多列的数据框 第一列包含 系统 1 系统 2 等类别 第二列包含代表 0 和 1 的数字 请看下面 例如 SYSTEM Q1 Q2 System 1 0 1 System 1 1 0 System 2 1 1 System 2
  • jQuery 可以检测特定的 URL 并根据该 URL 执行功能吗?

    我有一个正在开发的网站 如果 URL 与特定 URL 匹配 我需要能够执行特定功能 这是我正在尝试做的一个例子 如果 URL 与此 URL 匹配 http www example com EIFS items search php l2 3
  • 如何将数字转换为时间?

    我正在尝试使用 date fns 版本 1 30 1 或纯 JavaScript 创建一个接受数字并返回时间戳 HH mm 的函数 我想要实现的是在输入时间时帮助用户 当用户离开输入字段时 我使用 Vue js 更新该字段 因此 如果用户输
  • 运行时在 Eclipse 中查找依赖包

    Eclipse 包 例如 在激活器代码中 如何在运行时找到依赖的 Bundle 实例 我想找到 Eclipse 选择的包来满足依赖关系要求 我不想自己解释清单 一个例子 我想在我当前包所依赖的所有包中找到名为 marker txt 的所有资
  • Javascript:检测设备是否可以拨打电话[重复]

    这个问题在这里已经有答案了 是否可以检测设备是否可以拨打电话 我有一个包含电话号码列表的网页 如果设备可以调用 我想让它们可点击 使用tel 关联 当我在桌面浏览器中单击此类链接时 Firefox 报告 地址不明白 Firefox 不知道如
  • 在发布模式下出错,但在构建模式下不会出错

    我最近在 Visual 2008 中使用 opencv 和 c 做了一个项目 当我在调试模式下构建项目时 我没有遇到任何问题 但是当我在发布模式下构建项目时 我收到以下错误 1 gt test obj error LNK2001 unres
  • 苹果网站推送:推送包签名验证失败,但苹果证书没问题

    我正在尝试使用 Codeigniter 向 Safari 实现 Web 推送通知 我正在遵循苹果指南 我创建了一个库来创建基于此的推送包康纳拉科姆github 项目 这是我的图书馆
  • 禁用 iPhone 截图功能

    我正在为客户开发企业iPhone应用程序 手头的问题是客户信息将显示在手机上 我的客户担心可以使用 iPhone 屏幕捕获功能 主页 电源按钮 捕获信息 然后通过电子邮件发送或从手机同步 有什么办法可以禁用屏幕截图功能吗 这可以通过编程方式
  • 如何从命令行使用 REG_EXPAND_SZ?

    我正在阅读有关修改 Windows 注册表的命令的 Windows 命令行文档 Win F1 特别是 reg add 命令 reg add HKCU testfolder t REG EXPAND SZ v Stokrotka d syst
  • 访问帧内的帧

    好的 情况是这样的 我订阅了一个网站 可以让您添加自己的代码等 他们有一个论坛编辑器 我无法设置皮肤以匹配我的网站 所以我只想更改最内框架的颜色 以下示例中的 doc3 这是基本设置 是的 所有文档都来自同一域 但我只能将代码添加到主文档中
  • C 中将数组和数组指针传递给函数的区别

    C 中的两个函数有什么区别 void f1 double a void f2 double a 如果我要在一个相当长的数组上调用这些函数 这两个函数的行为是否会有所不同 它们会在堆栈上占用更多空间吗 首先 一些标准语 6 7 5 3 Fun