-1

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

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

双平均(双* a,整数大小)

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

这是我的解决方案:

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) 有什么作用呢?如果可能的话,有人可以简单介绍一下它是如何工作的吗?

提前致谢。

4

2 回答 2

5

a是指向 a 的指针double

如果你写*a,这个指针会被取消引用,你会得到指针指向的数据,即double值。请注意,星号必须在指针前面。(这是一个“前缀”一元运算符。)

a*不是有效的语法(它试图与仍然必须遵循的东西相乘......) a

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

*(a + count)现在完全取消引用这个指针,它为您提供count数组的第 - 个元素。

a[count]完全一样;这只是一个更好的语法。

注意:您也可以a++在循环中使用。它的作用是将指针在数组中增加一个位置。下次您取消引用ausing*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
}

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

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

我想给您的第二个注意事项是,您不需要在这里使用整数变量来计算元素。由于您的指针现在已经携带信息,因此您的计数器现在仅用于停止循环。这也可以通过将指针与一些我们保存在变量中的“结束指针”进行比较来完成:

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

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

我希望这能稍微说明一下指针运算。您可以像使用索引变量(您的count变量)一样使用指针“计算”。例如,您甚至可以减去它们来计算指针之间​​的偏移量。

于 2013-05-10T12:21:08.523 回答
0

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

读取指针

于 2013-05-10T12:21:03.017 回答