我正在学习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维?
答案 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数组。