指向二维数组的指针

时间:2013-10-20 15:34:25

标签: c pointers

我正在学习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;    
   }

我的问题是这个。为什么我必须使用(float *)来平衡余额?这是因为数组是2维吗?那么指针也是2维?所以我必须将其转换为1维?

5 个答案:

答案 0 :(得分:3)

  

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

这是因为p类型为float *,而balance在衰减到指针后属于float (*)[5]类型。

  

这是因为数组是2维吗?

是。

  

所以指针也是2维?

balance衰败到float (*)[5]

  

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

是。

答案 1 :(得分: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 */

答案 2 :(得分:0)

此示例演示如何在内存中分配数组。一个二维数组由行分配,这些行位于第一行之后,内存中有第二行数组。由于数组的内存被分配为一个扩展区,因此您可以将其解释为一维数组。

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

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

答案 3 :(得分:0)

  

为什么我必须使用(float *)

来转换余额

你没有必须,你可以将它简单地用作数组,就像在printf()中一样。我建议你不要将平面访问和多维访问结合起来。

答案 4 :(得分:-1)

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

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

右!!

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

你所做的是,将2D数组变量类型转换为指针作为一维数组...即。根据指针变量'p'你在'balance'中分配的是一个2D数组现在变成了一维数组......

如果你指定lyk这个

float ** p;

然后

P =平衡;是一个有效的语句,指针将其视为2D数组。