用于在C ++中计算平均值的数组的指针

时间:2013-05-10 12:17:11

标签: c++ pointers

我在C ++中有一个关于指针的问题:

  

编写一个函数来计算浮点数据数组的平均值:

     

双倍平均值(double * a,int size)

     

在函数中,使用指针变量而不是整数索引来遍历数组元素。

这是我的解决方案:

int main()
{
const int size = 5;
double num_array[] = {2,2,3,4,5}; 
double* a = num_array;
cout << average(a,size);
cout << endl;

system("PAUSE");
return 0;
}

double average(double* a,const int size)
{
double total = 0;
for (int count =0; count< size; count++){
    total = total + *(a + count);
}
return total/size;
}

它工作正常,但我对平均函数中指针的for循环有疑问。如果我将for循环中的语句替换为:

    total = total + a*;

(我认为我们应该这样做,将数字中的所有数字加起来但不幸的是它给了我错误的答案)

那么*(a + count)是做什么的?如果可能的话,有人可以简单介绍一下它的工作原理吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

a是指向double的指针。

如果您编写*a,此指针会被取消引用,您将获得指针指向的数据,即double值。请注意,星号必须位于指针前面。 (它是&#34;前缀&#34;一元运算符。)

a*没有有效的语法(它会尝试将乘以 a与某些仍然必须遵循的内容...)

a + count是指针算术。它为您提供a,但count个元素的数量偏移到原始a指针。所以它现在指向数组中的count - 元素。

*(a + count)现在正好取消引用此指针,它会为您提供数组的count元素。

a[count]完全相同;它只是一个更好的语法。

注意:您也可以在循环中使用a++。它的作用是将指针递增到数组中的一个位置。下次使用a取消引用*a时,它会返回下一个条目。所以你的循环可以像这样重写:

double total = 0;
for (int count = 0; count < size; count++){
    total = total + *a;    // Access the element a currently points to
    a++;                   // Move the pointer by one position forward
}

您甚至可以将增量和解除引用操作组合到一个表达式中。后缀增量语法a++将返回旧指针并将指针递增一个位置。解除引用a++现在意味着您取消引用旧指针。

double total = 0;
for (int count = 0; count < size; count++){
    total = total + *(a++);
}

我想给你的第二个注释是你不需要你的整数变量来计算元素。由于您的指针现在已经包含信息,因此您的计数器现在仅用于停止循环。这也可以通过将指针与一些&#34;结束指针&#34;进行比较来完成,我们将其保存在变量中:

double total = 0;
double *end = a + size; // Store the end of the array
while(a < end) {
    total = total + *(a++);
}

正如您所看到的,我将for循环转换为while循环,因为我不再需要初始化或增加某些内容(请记住:转到数组的下一个条目是在体!)。

我希望这会略微说明指针算法。你可以&#34;计算&#34;指针与索引变量(您的count变量)类似。例如,您甚至可以减去它们来计算指针之间​​的偏移量。

答案 1 :(得分:0)

*是解除引用运算符,对地址a进行操作,按计数增加。

阅读Pointers