c - 数组 b[] 的值如何被另一个函数的另一个数组 a[] 值填充?
问题描述
我在互联网上找到了这段代码。我从 1 小时开始就感到困惑。我发现奇怪的是数组 b[] 在具有本地范围的 met2() 函数内。还有另一个数组 a[] 位于 met1() 函数内部,具有本地作用域。但是如何将 a[] 的值转移到 b[] 数组。最重要的是,这两个函数都没有返回任何值。这太令人困惑了。请帮帮我。我在网上搜索,但没有人问过这样的问题。
#include <stdio.h>
int main()
{
met2();
return 0;
}
void met1(int a[1])
{
a[0]=199;
}
void met2()
{
int b[1];
met1(b);
printf("%d",b[0]);
}
解决方案
这里的关键是要理解,每当我们将数组声明为函数的参数时,它都会被调整为指向其第一个元素的指针。C17 6.7.6.3 强调地雷:
将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如果有)是在数组类型派生的 [ 和 ] 中指定的那些。
这意味着void met1(int a[1])
和void met1(int* a)
100% 等效。前者被编译器默默地翻译成后者。
这很令人困惑,因为int a[1]
它看起来像一个数组声明,人们可能很容易想到数组是按值传递的。但是在 C 中不可能按值传递数组。
在您的情况下,本地数组作为指向其第一个元素的指针b
传递给。met1
随着a[0] = ...
那个指向的元素被改变。
推荐阅读
- php - PHP显示为文本
- javascript - Froala 编辑器禁用下拉菜单中的按钮?
- java - 为什么优化的素数计数算法运行速度较慢
- html - 我在将 .css 文件中的 id 和类引用到 .html 文件时遇到问题
- networking - 网络只有登录后才能工作?
- angular - 角度如何将整数格式化为日期格式 hh/mm/ss
- node.js - 转译 .ts 源文件,无需依赖配置文件
- javascript - 您可以在 Javascript 中创建对对象数组的引用吗?
- python-3.x - 关于自动执行某些任务的问题
- swift - SwiftUI:单击按钮时如何呈现视图?