这段代码是一个丑陋的黑客,只会让你感到困惑,现在以及将来你回来查看这段代码时。指针算法背后的想法是使访问数组更容易,而不是更难。如果你改变
float *p;
至
float **p;
您的指针现在是双指针,这意味着当您使用间接运算符 (*) 一次时,您将获得另一个指针。您创建的数组如下所示:
[0,0][0,1][0,2][0,3][0,4]
[1,0][1,1][1,2][1,3][1,4]
[2,0][2,1][2,2][2,3][2,4]
[3,0][3,1][3,2][3,3][3,4]
[4,0][4,1][4,2][4,3][4,4]
[5,0][5,1][5,2][5,3][5,4]
[6,0][6,1][6,2][6,3][6,4]
[7,0][7,1][7,2][7,3][7,4]
[8,0][8,1][8,2][8,3][8,4]
[9,0][9,1][9,2][9,3][9,4]
由于您有两个间接级别,因此第一个指针将指向您的行,第二个指针将指向您的列。由于间接是向后完成的,这意味着在指针表示法中,最里面的元素是数组表示法中最左边的元素。
arr[ROW][COL] === *(*(p + ROW) + COL)
现在,如果要访问元素,可以使用数组表示法arr [ROW][COL] 或指针算术来实现。使用双指针,有两个间接级别。所以虽然你不得不使用
p = (float *) balance;
*(p + 16)
要获得您想要的位置,实际上(在我看来)简单地编写会容易得多
p = balance;
*(*(p + 3) + 1)
因为现在您正在使用类似于数组索引的指针算法,并且一眼就知道您想要指向哪个元素更容易。
至于将双指针转换为单指针,首先处理双指针确实更容易,这就是数组的名称。
int arr[ROW][COL] = {0};
int **p_arr = arr; /* Valid operation. arr without array notation is a double pointer */