1

我现在正在学习 c,我正在学习指针。我读过一些例子,我想出了这个:

   #include <stdio.h>

   int main ()
   { 
      float balance[10][5];
      float *p;

      p = (float *) balance;

      *(p + 16) = 200.0; //init the balance[3][1] with the value 200.0
       printf("%f\n", balance[3][1]); 
       return 0;    
   }

我的问题是这个。为什么我必须用 a 来平衡(float *)?这是因为数组是二维的吗?所以指针也是二维的?所以我必须将它转换为一维?

4

5 回答 5

3

为什么我必须用 (float *) 来平衡?

这是因为pis 的类型float *whilebalancefloat (*)[5]在衰减到指针之后的类型。

这是因为数组是二维的吗?

是的。

所以指针也是二维的?

balance衰减到float (*)[5]

所以我必须将其转换为一维?

是的。

于 2013-10-20T15:36:52.733 回答
1

这段代码是一个丑陋的黑客,只会让你感到困惑,现在以及将来你回来查看这段代码时。指针算法背后的想法是使访问数组更容易,而不是更难。如果你改变

    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 */
于 2013-10-20T16:13:08.017 回答
0

此示例演示如何在内存中分配数组。二维数组是按行分配的,第一行之后是内存中数组的第二行。由于数组的内存被分配为一个范围,因此您可以将其解释为一维数组。

您示例中的数组实际上有 50 个元素 (10 * 5)。由于行在内存中按顺序排列,因此元素 balance[3][1] 的位置可以计算为 3 * 5 + 1 等于 16。因此,如果您将内存的范围视为一维数组,则对应的元素可以写为 p[16] 或(相同)为 *(p + 16)。

二维数组的这种解释的一个有用技巧可以应用于二维数组的排序。使用标准排序函数将二维数组排序为一维数组要简单得多。

于 2013-10-20T15:54:17.637 回答
0

为什么我必须用 (float *) 来平衡

您不必这样做您可以将它简单地用作数组,就像在printf(). 我建议您不要将平面访问和多维访问结合起来。

于 2013-10-20T15:58:45.813 回答
-1

这里变量“balance”存储二维数组的基地址..

什么是指针?存储地址的变量称为指针

正确的!!

'p' 是单个浮动指针,它存储浮动变量的地址,但这里的 'balance' 是浮动数组变量。

您所做的是,将二维数组变量类型转换为指针作为一维数组...即根据指针变量“p”,您在“平衡”中分配的二维数组现在已变为一维数组。 .

如果你分配指针 lyk 这个

浮动**p;

然后

p=余额;是一个有效的语句,指针将其视为二维数组。

于 2013-10-20T15:43:47.570 回答