【问题标题】:checking my understanding of pointers/structures and arrays [closed]检查我对指针/结构和数组的理解[关闭]
【发布时间】:2013-03-26 18:10:21
【问题描述】:

大家好,我只是想了解一些关键概念,并且已经完成了自己的研究,但有一些问题,如果有人可以检查它们是否正确,我将不胜感激。我正在为考试做复习,我们的教授告诉我们自己弄清楚……所以我做了,就这样:)

1:声明一个名为 thePointer 的指针,用于保存具有 10 个元素的数组中的一个元素的地址,称为 Pointed

int Pointed[10] = {};

int *thePointer = &Pointed[1];

在这方面需要帮助...

2:编写一个函数,该函数将接受数组的地址和数组中的元素数量,并使用信息将数组的每个元素初始化为零

void arrayFunction (int *array, int element)

    for (x = 0; x < element; x++);
      {
      array[x] = 0;
      }

3:创建一个包含表示以下内容的位的结构

--2 个字段,每个字段包含 4 位 BCD 数字,它们一起保存当前旋转计数(我称它们为 CRC1 和 CRC2) 电机方向:2位 速度:4位 故障条件:3位 将结构命名为 controlMotor

struct controlMotor{

unsigned char CRC1: 4;
unsigned char CRC2: 4;
unsigned int motorDirection: 2;
unsigned int speed: 4;
unsigned int faultCondition: 3;
};

-- 使用 typedef 来命名这个新的数据类型:statusDrive_t

typedef controlMotor statusDrive_t;

--创建名为marsDrive的结构数组来保存每6个驱动器的状态

statusDrive_t marsDrive[5] ={statusDrive_t.CRC1,statusDrive_t.CRC2,statusDrive_t.motorDirection,statusDrive_t.speed,statusDrive_t.faultCondition}

用最大值初始化数组第一个元素的每个字段

marsDrive[0].CRC1 = 15;
marsDrive[0].CRC2 = 15;

【问题讨论】:

  • 尝试一次只问一个问题。或者,如果您的后续问题很少,那么至少尽量保持连贯性(尽可能相关)。
  • 我认为你错过了 #2 的重点
  • 同意迈克。您可能会考虑为#2 设置一个不同的开口,类似于void arrayFunction(int arr[], size_t n)
  • 除了 Mike 的评论之外,您还可以像 #2 一样使用 arrayIndex 。循环的最后一次迭代将尝试访问不属于数组的元素。请记住,一个 10 元素数组的索引将在 [0..9] 范围内。因此,您需要使用 arrayIndex
  • 结束不是一个真正的问题,因为它是由家庭作业分隔的几个问题。

标签: c arrays pointers typedef


【解决方案1】:

Q1:如果问题是指向数组的any 元素,你是对的。但 1 不是数组的第一个元素。

Q2:函数应该接受数组的地址,你是在函数内部声明数组。此外,应避免使用for 之后的分号。此外,您应该只使用

void ArrayFunction(int arr[], int i) {
for (x = 0; x < i; x++){
      arr[x] = 0;
      }
}

我觉得 Q3 不错,但是 typedef 应该是

typedef struct controlMotor statusDrive_t;

数组也必须声明为

statusDrive_t marsDrive[6];

数组从 0 开始(在您的情况下为 5)

【讨论】:

  • 感谢您的回复!似乎我在问题 2 上搞砸了,但还是谢谢你!至于其他问题我已经修改了,请告诉我现在是否正确(Q3)
  • 您的 typedef 仍然是错误的。正如我在答案中所写的那样声明数组。 = 之后的任何内容都不是必需的。 statusDrive_t marsDrive[5] 创建一个包含 五个 元素的数组,其索引从 0 到 4 开始。所以,你应该使用 `statusDrive_t marsDrive[6]' 另外,初始化数组第一个元素的每个字段可能意味着初始化数组中第一个结构的值。执行以下操作:marsDrive[0].CRC1=..... marsDrive[0].CRC2=.... 对于每个字段。
【解决方案2】:

1 看起来不错,但您不需要 &amp; 运算符:

int *thePointer = Pointed;

会起作用,因为数组会衰减为指针。

2 write a function that will accept the address of an array and number of elements in an array 您的函数只需要一个int,这甚至与问题所问的内容都不接近。这个问题试图让您参考的一点是,将数组传递给函数会丢失有关数组中元素数量的信息。

我很确定他们正在寻找类似的东西:

void arrayFunction (int * arr, int elements) // you could do (int arr[], ... as well 
{
    for(int i = 0; i<elements; i++)
        arr[i] = 0;
}

int main(void) {
    int i[4];
    arrayFunction(i, 4);

3 你的typedef错了,应该是:

typedef struct controlMotor statusDrive_t;

语法是:

typedef <the type> <the new name to call it>;

在这种情况下,类型是struct controlMotor

数组也被错误地声明了。 int marsDrive[6] 构成一个 ints 数组。你想把类型放在数组之前,所以在这种情况下,因为你刚刚做了那个花哨的新 typedef:

statusDrive_t marsDrive[6];

将为您提供一个包含 6 个 struct controlMotor 的数组(编号为 0 到 5)。对于 3 的最后一部分:initialize each field of the first element of array with maximum value 您需要初始化第一个元素的字段。由以下人员完成:

marsDrive[0].CRC1 = ...
marsDrive[0].CRC2 = ...

当您在[] 中增加该值时,您将远离第一个元素。您可以通过位数计算出每个的“最大”大小。例如 CRC1 是 4 位,这意味着您最多可以拥有 11112 即 1510

【讨论】:

  • 非常感谢 Mike 的回复,尤其是与 Q2 和 Q3 相关的...关于元素价值的非常好的观点
  • @mike : ...Will give you an array of 5 struct controlMotor's 是错误的。 6代表编号。数组的元素,其索引从 0 到 5
  • @cipher - 是的,我的错,打字太快了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多