【问题标题】:C - Help understanding pointersC - 帮助理解指针
【发布时间】:2016-11-11 20:29:55
【问题描述】:

我阅读了this page 关于数组和指针之间的关系,它澄清了很多事情,但我仍然有点困惑。以下代码:

#include <stdio.h>
int main()
{
  int i, classes[6],sum = 0;
  printf("Enter 6 numbers:\n");
  for(i = 0; i < 6; ++i)
  {
  // (classes + i) is equivalent to &classes[i]
  scanf("%d",(classes + i));

  // *(classes + i) is equivalent to classes[i]
  sum += *(classes + i);


}
  printf("Sum = %d", sum);
  return 0;
}

所以根据我的理解,这段代码读取了 6 个整数,然后将每个整数存储在一个内存地址(classes+i)中。然后它打印出每个内存地址 *(classes + i) 的值的总和。这一切都是有道理的,但为什么首先需要将值存储到 (classes + i) 中?这样做有什么作用?感谢您的帮助,我正在努力完全理解这些东西。

【问题讨论】:

  • why exactly do the values need to be stored 没有理由,只是为了向您展示如何将值存储在数组的不同索引处
  • 您似乎完全理解代码的作用。要了解为什么有人编写代码来做到这一点,您必须询问编写它的人。你可以随心所欲地查看printf("moose");,你不会明白我为什么要写代码来打印“moose”。
  • 如果你的意思是“为什么你必须这样做得到 6 ints 的总和?”。答案是,你没有。您可以简单地循环,将每个输入的值添加到sum,然后在最后打印出 sum。除非您需要访问 for 循环之外的各个值,否则没有实际理由存储它们。

标签: c arrays pointers memory


【解决方案1】:

为什么首先需要将值存储到 (classes + i) 中?

没错,不必如此。目的是说明您在评论中已经得到的指针和数组之间的关系:

scanf("%d",(classes + i)); // (classes + i) is equivalent to &classes[i]

但是,对于任务本身(即计算总和),不需要(classes+i)。只使用一个变量会更简单。

int i,v,sum = 0;
printf("Enter 6 numbers:\n");
for(i = 0; i < 6; ++i)
{
    scanf("%d",&v);
    sum += v;
}

【讨论】:

    【解决方案2】:

    对此感到困惑并不羞耻。 C 编程语言设计得很糟糕。 C 中对指针和数组的处理是不恰当的。优秀的编码人员通过使用合理的编码结构来解决这个问题,例如在您的示例中注释掉的那些。

    仅仅因为 C 允许你这样做

    * (classes + i) 
    i [classes]
    classes [i] 
    

    并不意味着您必须使用除最后一个以外的任何变体。

    这一切都是有道理的,但为什么首先需要将值存储到 (classes + i) 中?

    他们不需要。这可以使用单个整数来完成。代码可以做类似的事情

    int value ; 
    . . . . 
    scanf("%d", &value);
    
    sum += value ;
    

    这样做的目的是什么?

    这似乎是一个纯粹的说明 C 技巧的教学程序。

    【讨论】:

      【解决方案3】:

      为什么首先需要将值存储到(classes + i) 中?

      这是因为当你声明一个数组 int classes[6] 时,这里的 classes 充当指针,即基地址,即 &amp;classes[0],当你对指针应用算术运算时,就会发生指针算术运算。例如:

      //pointer arithmetic
      classes + i = base_address + (i * sizeof classes)
      
      //hence
      classes = &classes[0]
      classes + 1 = &classes[1]
      classes + 2 = &classes[2]
      //so on.....
      

      现在,这些地址可以作为参数发送到scanf(),以在特定索引数组中存储特定值。这只是将元素存储到数组中的一种方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多