2016-11-11 87 views
2

我读了this page关于数组和指针之间的关系,它阐明了很多东西,但我仍然有点困惑。以下代码:C - 帮助理解指针

#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点的整数,然后在存储器中地址(类+ I)存储的每个整数。然后打印出每个存储器地址*(类+ i)的值的总和。这一切都有道理,但为什么这些值需要首先存储到(classes + i)中?这是做什么完成的?感谢您的帮助,我很努力地完全理解这个东西。

+0

'为什么需要存储值'没有理由,只是为了向您展示如何将值存储在数组的不同索引处 –

+3

您似乎完全理解代码的作用。为了理解*为什么有人做了这样的代码,你必须要问谁写了它。您可以尽可能彻底地查看'printf(“驼鹿”);''''''''''''''''''''''''''' –

+0

如果你的意思是“你为什么必须这样做,得到6个int的总和?”。答案是,你没有。您可以简单地循环,将每个输入的值添加到“sum”,然后在最后打印出总和。除非你需要访问'for'循环之外的单个值,否则没有实际的理由来存储它们。 – yano

回答

3

为什么这些值首先需要存储到(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; 
} 
0

到底为什么做的值需要被存储到(classes + i)摆在首位?

这是因为当你声明数组int classes[6],这里classes作为指针的基址即,&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()作为参数传递给在索引的特定阵列存储特定值。这只是将元素存储到数组中的一种方法。

2

对此感到困惑并不值得惭愧。 C编程语言设计不佳。在C中处理指针和数组是不合适的。良好的编码人员通过使用理性的编码结构来解决这个问题,比如你的例子中注释掉的那些结构。

只是因为C允许你做

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

并不意味着你必须使用比最后一个以外的任何变种。

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

他们不需要。这可以使用一个整数来完成。该代码可以做类似

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

sum += value ; 

它是什么实现通过这样做呢?

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