我在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;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我对平均函数中指针的for循环有疑问.如果我用for循环替换语句:
total = total + a*;
Run Code Online (Sandbox Code Playgroud)
(我认为我们应该这样做,将数组中的所有数字加起来但不幸的是它给了我错误的答案)
那么*(a + count)是做什么的?如果可能的话,有人可以简单介绍一下它的工作原理吗?
提前致谢.
a是指向a的指针double.
如果你写*a,这个指针被取消引用,你得到指针指向的数据,即double值.请注意,星号必须位于指针前面.(这是一个"前缀"一元运算符.)
a*是没有有效的语法(它试图与仍然必须遵循的东西相乘 a ...)
a + count是指针算术.它给你a但是count元素的数量偏移到原始a指针.所以它现在指向count数组中的-th元素.
*(a + count)现在取消引用这个指针,它给出count了数组的第th个元素.
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
}
Run Code Online (Sandbox Code Playgroud)
您甚至可以将增量和解除引用操作组合到一个表达式中.postfix-increment语法a++将返回旧指针并将指针递增一个位置.a++现在取消引用意味着您取消引用旧指针.
double total = 0;
for (int count = 0; count < size; count++){
total = total + *(a++);
}
Run Code Online (Sandbox Code Playgroud)
我想给你的第二个注释是你不需要你的整数变量来计算元素.由于您的指针现在已经包含信息,因此您的计数器现在仅用于停止循环.这也可以通过将指针与一些"结束指针"进行比较来完成,我们将其保存在变量中:
double total = 0;
double *end = a + size; // Store the end of the array
while(a < end) {
total = total + *(a++);
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我将for循环转换为while循环,因为我不再需要初始化或增加某些内容(请记住:转到数组的下一个条目是在正文中完成的!).
我希望这会略微说明指针算法.您可以使用与索引变量(您的count变量)类似的指针"计算" .例如,您甚至可以减去它们来计算指针之间的偏移量.
| 归档时间: |
|
| 查看次数: |
7537 次 |
| 最近记录: |