为什么这个说法正确? &f的类型为float **

时间:2018-11-08 19:38:35

标签: c pointers malloc

我想到了这个问题: 我有以下指示

float *f = (float*) malloc(5*sizeof(float));

其后果是

&f is of type float**

我不明白为什么会这样。

5 个答案:

答案 0 :(得分:6)

f的类型为float*,即浮动指针。因此&ff的地址,因此其类型是指向float指针的地址,也就是指向float指针的地址,表示float**

答案 1 :(得分:4)

  

我有以下说明

这些东西被称为“声明”。

SELECT `sample_id`, `question_id`, `answer`
FROM `question_answer`
WHERE `question_id` = 1 AND `answer` = 'Yes' 

不要转换malloc的结果:

float *f = (float*) malloc(5*sizeof(float));

更好的是,通过为内存分配指针来确定大小:

float *f = malloc(5 * sizeof(float));

这样一来,即使float *f = malloc(5 * sizeof(*f)); // 5 times sizeof the type, f points to 的类型将发生变化,您也可以安全。在f之后没有忘记更改类型的机会。

现在sizeof指向一个足以容纳五个连续f的内存区域;
float就像所有其他变量一样。让我们首先获取一些不太可怕的变量的地址:

f

现在int i; int *ptr = &i; // &i yields the address of the variable i. // The type of i is (int), // so a pointer to it is of type (pointer to (int)) -> int*

f

答案 2 :(得分:1)

让我们从一个简单的示例开始:

int a = 42;

在此示例a中包含值42的变量中。

&a是该变量的地址。它可以存储在指针中:

int *b = &a;

int *类型的变量是int类型变量的指针。

返回您的问题:

在您的情况下,f的类型不是int,而是float*。结果,&f的类型为float**

答案 3 :(得分:1)

通常,像

这样的表达式的类型
&something

pointer to the type of something。由于f的类型为*float,因此&f的类型必须为pointer to *float,写为**float

相反,如果something的类型为*sometype(即pointer to sometype),则*something的类型为sometype。所以如果你有

float **f;

然后,*f的类型为*float,而**f的类型为float

答案 4 :(得分:0)

指向对象的指针保存对象的地址。在您的情况下,f是指向float的指针,也就是说f的值是浮点数的地址(假设该指针无效) 。 通过扩展,&ff的地址,也就是说,它是指向float的指针的地址,或者,如果您愿意,它是a的地址的地址。 float,这与说它是一个指向浮点数的指针的指针相同。