我在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)是做什么的?如果可能的话,有人可以简单介绍一下它的工作原理吗?
提前致谢。
答案 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。