【问题标题】:How to pass a variable value to an array in C如何将变量值传递给C中的数组
【发布时间】:2016-05-20 07:32:22
【问题描述】:

我是一名新手程序员,试图理解 C 中的数组。具体来说,我想获取变量的数值并将其输入数组。我试图将值分配给数组,但失败并显示错误消息。有人可以简单地解释一下如何将一个值推送到一个数组中,然后能够只访问最后一个数字吗?

我的最后一次尝试:

#include <stdio.h>
unsigned int TMR0 = 158;


int main(void)
{
unsigned int V = TMR0; 
unsigned int Random[2] = {V};
printf("%d \n" , *(Random+2));
return 0;

谢谢。

【问题讨论】:

  • 当你说“访问最后一位”时,你是说你想要“158”,还是说你想要“8”?我担心是后者,在这种情况下,你需要在学习数组之前倒带学习整数。
  • *(Random+2)Random[2] 相同,并且在您访问数组之外​​的无效内存位置时调用 UB。
  • 您将从良好的教学资源中受益匪浅。购买 Steven Prata 的 C Primer Plus 的 PDF 或硬拷贝。通读一遍,并在每章末尾做所有的例子和练习。大多数大学生可以在一个长周末做到这一点。
  • 你能把问题说清楚一点吗?它为其他人节省了时间。
  • @paddy - 是的,我希望访问最后一个数字“8”。我是数组新手,只有非常基本的 C 理解。谢谢

标签: c arrays variables variable-assignment


【解决方案1】:
unsigned int Random[2];

数组将被声明为两个位置。

Random[0] Random[1] // two accessible positions in that array.

当你给数组赋值时,

unsigned int Random[2] = { V} ;

值将存储在数组的第一个位置。 Random[0].

*(Random+2) 将访问位置Random[2]。该数组无法访问哪个位置。这将导致未定义的行为。

另一件事是,如果您需要将值分配给您必须这样做的两个位置。

unsigned int Random[2] = {V,V} ;

要访问数组中的最后一个元素,

*(Random+1) or Random[1]

希望这个link 会有所帮助。

【讨论】:

  • 我看到了一些错误,需要将数组声明为 unsigned int Random [3] - 以允许从变量 V 存储三位数字 1,5 和 8。我正在寻找访问值为 8 的最后一个数字(这将是 Random[2],因为计数从 [0] 开始。要清楚,V 是一个变量 - 我可以简单地将它放在 {} 之间,它将被读入数组?
  • @chopnhack 当您使用unsigned int Random[3] = {V}; 时,158 存储在Random[0] 中,而不是每个数组索引中的每个数字。为此,您必须将数字拆分为数字(使用% 10 或其他方法)并将每个数字分配给数组的每个插槽。
  • @Cool Guy - 哎哟,谢谢!这对我来说是一个很大的误解,我认为数组中的每个单元格只存储一个数字(0-9),有点像!
  • @chopnhack,强烈建议让你的导师/助教解释数据是如何存储在内存中的(这应该在讨论计算机如何工作的课程中解释过)也让他们解释十六进制数字系统和如何在不同的数字基数之间进行转换,大端和小端数字表示的概念等。请注意:158 将(具有 4 个字节/32 位整数)看起来像:0x0000009E 或 0x9E000000,具体取决于底层的 Endian-ness硬件架构。
  • @user3629249 - 一路上没有教练、黑客和自学。谢谢!
【解决方案2】:

您实际上并不需要一个数组来访问您的号码的数字——您只需要数学。

重要的是要意识到“数字”意味着特定的数字基数。在计算机中,数字以二进制表示。为方便起见,它们可以在我们的代码中使用通用基数表示:十进制、十六进制和八进制是我们在 C 等语言中通常使用的基数。

因此,要获得以 10 为底的最后一位 ,您将采用 模 10 的值:

int val = 158;
int last_digit = val % 10;
printf( "%d\n", last_digit );

如果需要求除最后一位以外的数字,可以先进行整数除法再取模:

int second_to_last_digit = (val / 10U) % 10;

或者,您可以将数字转换为字符串,然后查看该字符串中的每个字符。但我不打算在这里深入讨论,因为向新程序员提供太多信息可能会让人感到困惑。

【讨论】:

  • 感谢帕迪! strcopy 等是我认为我最终通过创建数组所做的事情,由于我在编译器中收到的错误,我一直在搞乱数据的类型。我避免了模和除法,因为它们调用了数学库-这是针对字空间内存有限的小型图片 mcu。能否详细说明一下字符串的转换?
  • 你确定吗?整数模和除法不应调用数学处理器。转换为字符串将涉及更多开销。
  • 我使用模数检查,它消耗了大约 63 个单词空间,大约是我总内存的四分之一!我想你可以明白为什么我更喜欢一种不那么费力的方法 :-) 我还不知道字符串运算符的成本是多少。
  • 您需要所有个数字,还是只需要最后一个?
  • 嗨,paddy,是的,我只需要最后一个数字。
猜你喜欢
  • 2019-08-18
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多