我正在查看谷歌的一些代码,这引起了我的注意。
#include <iostream>
using namespace std;
const int kStudents = 25;
const int kProblemSets = 10;
// This function returns the highest grade in the Problem Set array.
int get_high_grade(int *a, int cols, int row, int col) {
int i, j;
int highgrade = *a;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
if (*(a + i * cols + j) > highgrade) // How does this line work?
highgrade = *(a + i*cols + j);
return highgrade;
}
main() {
int grades[kStudents][kProblemSets] = {
{750, 700, 85, 720, 84},
{85, 92, 93, 96, 86},
{95, 90, 103, 76, 97},
{65, 62, 73, 84, 73}
};
int std_num = 4;
int ps_num = 5;
int highest;
cout << *(int *)grades << endl;
highest = get_high_grade((int *)grades, kProblemSets, std_num, ps_num);
cout << "The highest problem set score in the class is " << highest << endl;
}
那是(int *)grades
。我以前从未在任何教程中见过它,所以它让我措手不及。我使用cout << *(int *)grades << endl;
来确定它是一个指针,但我从未见过具有该语法的指针。
任何人都可以解释它是如何工作的吗?感谢。
答案 0 :(得分:2)
由于成绩是一个二维数组,当转换为指针时,你会得到一个指向数组第一项的指针。这就是(int *)的作用。 前面的*获取指针的值 - 如上所述,是第一个项目,在这种情况下具有值750.
相当于成绩[0] [0]。
答案 1 :(得分:2)
grades
是一个由int
个对象组成的数组。
指针表达式grades
在大多数上下文中被隐式转换为指向数组的初始(第0个)元素的指针,因此表达式grades
本身的类型为int(*)[kProblemSets]
},指向int
数组的指针。
(int*)
强制转换将此指针值从一种指针类型转换为另一种指针类型,*
取消引用生成的转换指针,产生int
结果。
这是值得怀疑的;我不认为可以保证代码能达到预期效果。如果意图是打印数组第一行的第一个元素的值,只需使用:
std::cout << grades[0][0] << std::endl;
(顺便说一句,main()
应为int main()
。C ++没有&#34;隐式int
规则;您必须明确指定返回类型。)