当 C 按值传递时,我的数组如何修改?

2023-12-03

我用 C 编写了一个简单的程序来检查两个单词是否是字谜。我的问题是,如果我传递 word_one 和 word_two 作为参数,这是否意味着我没有修改原始数组?我认为我正在有效地处理这些未归还的副本。

这意味着我不应该能够将它们与我的 equal_array 函数进行比较。

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>

#define MAXLENGTH ((int) (sizeof(letters) / sizeof(letters[0])))

void read_word(int counts[26]);
bool equal_array(int counts[26], int counts2[26]);

int main(void){

  int word_one[26] = { 0 };
  int word_two[26] = { 0 };

  printf("Enter first word: ");
  read_word(word_one); 

  printf("Enter second word: ");
  read_word(word_two); 

  if (equal_array(word_one, word_two))
    printf("These words are anagrams!");
  else
    printf("These words not are anagrams!");

  return 0;
}

void read_word(int counts[26]){
  char ch;

  while ((ch = getchar()) != '\n'){
    ch = toupper(ch);
    if (ch >= 'A' && ch <= 'Z'){
      counts[(ch - 'A')]++;
    } 
  }
}

bool equal_array(int counts1[26], int counts2[26]){
    int i;
    bool equal = true;

    for (i = 0; i < 26; i++) {
      if (counts1[i] != counts2[i]) {
        equal = false;
        break;
      }
    }
    return equal;
}

C 确实总是按值传递,但是当数组传递给函数时,它们always即使您在参数声明中指定了长度,也会衰减为指针。发生的情况是你的声明

void read_word(int counts[26])

相当于

void read_word(int * counts)

当你通过时word_one and word_two对于您的函数,它们收到的值是数组第一个元素的地址。这些仍然指向原始数组,因此,当您在函数中修改它们时,结果也在原始数组中可见。

ADDIT

有趣但鲜为人知的旁注:在 C99 及更高版本中,您可以声明您的函数,其长度前面为static, 如下:

void read_word(int counts[static 26])

这并没有改变函数接收地址副本而不是整个数组的事实,但它确实允许编译器优化和检测潜在错误。在这种情况下read_word上面,如果你传递一个,编译器会发出警告NULL- 指向函数的指针,或少于 26 个元素的数组。更多内容可阅读here.

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

当 C 按值传递时,我的数组如何修改? 的相关文章

  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • Cloud Dataflow - Dataflow 如何实现并行性?

    我的问题是 在幕后 对于逐元素 Beam DoFn ParDo 云数据流如何并行工作负载 例如 在我的 ParDO 中 我向外部服务器发送一个针对一个元素的 http 请求 我使用了 30 个工人 每个工人有 4vCPU 这是否意味着每个工
  • 如何以二维风格指定单元测试文件夹

    我有一个具有二维风格的项目 例如风味维度 设备 水果 移动香蕉 移动苹果 香蕉 stbApple 所有构建结果都很好 我只想进行单元测试stbApple当选择构建变体在 Android Studio 中 如何实现这一目标 我尝试过以下实验
  • JSR 363 的 UCUM 单位格式

    我正在使用 JSR 363 测量单位 和最新的参考实现
  • rpy2 - “R”对象没有属性“nls”

    我正在使用 rpy2 在 python 中的 r 中进行一些非线性回归 import rpy2 robjects as robjects from rpy2 robjects import DataFrame Formula from rp
  • Python - Urllib2 等待页面加载以抓取数据

    首先 我想说我不想使用 Python 2 7 10 未提供的任何库 同样的问题也发布在 Stack Overflow 上 但在 Requests 库中得到了解答 我有一个使用 urllib2 登录 Roblox com 的脚本 为了在尝试登
  • AngularJS:从模型数组中拼接模型元素时,ng-repeat 列表不会更新

    我有两个控制器 并通过 app factory 函数在它们之间共享数据 单击链接时 第一个控制器会在模型数组 pluginsDisplayed 中添加一个小部件 小部件被推送到数组中 并且此更改反映到视图中 使用 ng repeat 来显示
  • 如何找到至少2个向量中共有的元素?

    假设我有 5 个向量 a lt c 1 2 3 b lt c 2 3 4 c lt c 1 2 5 8 d lt c 2 3 4 6 e lt c 2 7 8 9 我知道我可以使用以下方法计算它们之间的交集Reduce 和 一起inters
  • C++ 失败时 istream 行为发生变化

    取自 参考参数 直到 C 11 如果提取失败 例如 如果在需要数字的地方输入了字母 则值保持不变并设置失败位 自 C 11 起 如果提取失败 则将零写入值并设置失败位 如果提取结果导致值太大或太小而无法适应值 std numeric lim
  • 使用产品风味时,每种风味中哪些文件是常见的,哪些文件是该风味特有的?

    productFlavors India USA 我们以两种产品口味为例 1 印度 2 美国 构建变体的总数将为 4 1 印度调试 2 印度发布 3 美国调试 4 美国发布 哪些文件对于所有风格都是通用的 哪些文件是特定于风格以及调试和发布
  • 如何在 Coq 中自动证明实数的简单相等?

    我正在寻找的是auto类似的策略可以证明简单的等式 例如 1 2 2 4 到目前为止 我手动尝试过的是使用ring simplify and field simplify来证明等式 即使这样效果也不好 Coq 8 5b3 下面的例子有效 R
  • 将数据从 .data 文件转换为 .csv 文件,并使用 pandas 将数据放入列中

    我想将 data 文件中的数据转换为 csv 文件 并将 data 文件中的数据放入其下带有值的列中 但是 data 文件具有特定的格式 我不知道如何将文本放入列中 data 文件如下所示 column1 column2 column3 c
  • 在提交 Ajax 时生成 CSRF 令牌 codeigniter

    您好 我正在寻找使用 ajax 提交表单时在 codeigniter 中重新生成 csrf 令牌的过程 我希望在不刷新页面的情况下重新生成令牌 有什么办法可以做到这一点吗 我根据情况在不同时间使用两种解决方案 1 方式有点乱 但推荐 获取控
  • 原始 CSS 文件中的条件 IE8 样式?

    我怎样才能只为 IE8 浏览器覆盖这个样式 我认为我不再关心 IE7 用户了 除非标记非常小 menu ul margin 0 padding 0 width 650px menu ul li display inline block wi
  • 找不到带有下划线的路由或者没有正确对待它

    我在路线中有这个 Rails application routes draw do namespace api do namespace v3 4 do 和控制器app controllers api v3 4 base controlle
  • LexResponse 输出无法理解 HTML 数据

    我在尝试让 AWS Lambda 函数在运行 SQL 查询时成功输出一系列 HTML 链接时遇到问题 private string GetEventSearchResults ILambdaContext context List
  • 如何使用 Gson 将 JSON 转换为 HashMap?

    我正在从服务器请求数据 该服务器返回 JSON 格式的数据 在发出请求时将 HashMap 转换为 JSON 一点也不难 但另一种方法似乎有点棘手 JSON 响应如下所示 header alerts AlertID 2 TSExpires
  • 如何使用 Storyboards/Cocoa 在 Swift 3.x 中引用视图的窗口

    随着 Xcode 和 Swift 中的所有更改 我无法弄清楚如何像在使用 XIB 的项目中那样处理 stotyboard 驱动的项目中的视图窗口 macOS 编程新手 如果这是基本内容 请提前道歉 使用故事板时 如何使用以下方法更改视图的窗
  • 具有 k 个部分的排序和非排序整数分区

    对于正整数n and k 让一个 k 分区n 是一个排序列表k不同的正整数加起来为n 并让给定的 等级 k 分区n是它在所有这些列表的排序列表中的位置 按字典顺序从 0 开始 例如 有两个 5 的 2 分区 n 5 k 2 1 4 和 2
  • 如何使 Eclipse Partstack 在最后一个部分关闭时不消失?

    我正在开发一个项目 该项目的主窗口由 mpartstack 组成 我在其中动态地从另一个部分添加部分 问题是 当最后一部分关闭时 mpartstack 消失 而另一部分占用所有空间 当我尝试添加新零件时 什么也没有发生 我尝试通过尝试添加新
  • 当 C 按值传递时,我的数组如何修改?

    我用 C 编写了一个简单的程序来检查两个单词是否是字谜 我的问题是 如果我传递 word one 和 word two 作为参数 这是否意味着我没有修改原始数组 我认为我正在有效地处理这些未归还的副本 这意味着我不应该能够将它们与我的 eq