奇怪的指针语法

时间:2016-10-10 19:43:36

标签: c++ pointers syntax

我正在查看谷歌的一些代码,这引起了我的注意。

#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;来确定它是一个指针,但我从未见过具有该语法的指针。

任何人都可以解释它是如何工作的吗?感谢。

2 个答案:

答案 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规则;您必须明确指定返回类型。)