此代码是一个丑陋的黑客攻击,只会让你迷惑,现在,当你回来看看这个代码在未来。指针算术背后的思想是让数组访问更容易,而不是更难。如果更改
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 */
为了避免使用强制转换,可以写'p =&balance [0] [0];' – sfk
True。但我只是回答了这个问题。 :) – haccks