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

Pointer for array to calculate average in C++

本文关键字:数组 指针 平均值 计算 用于 c++      更新时间:2023-10-16

我有一个关于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)是做什么的呢?如果可能的话,谁能简单地告诉我它是如何工作的?

a是指向double的指针。

如果你写*a,这个指针得到解引用,你得到指针指向的数据,即double值。注意,星号必须在指针前面。(这是一个"前缀"一元操作符)

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++);
}

我想给你的第二个注意事项是,你不需要在这里使用整数变量来计数元素。由于指针现在已经携带了信息,计数器现在只用于停止循环。这也可以通过将指针与某个"结束指针"进行比较来实现,该指针保存在一个变量中:

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

您可以看到,我将for循环转换为while循环,因为我不再需要初始化或自增一些东西(记住:转到数组的下一项是在主体中完成的!)。

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

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

读指针。