我想到了这个问题: 我有以下指示
float *f = (float*) malloc(5*sizeof(float));
其后果是
&f is of type float**
我不明白为什么会这样。
答案 0 :(得分:6)
f
的类型为float*
,即浮动指针。因此&f
是f
的地址,因此其类型是指向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
的值是浮点数的地址(假设该指针无效) 。
通过扩展,&f
是f
的地址,也就是说,它是指向float
的指针的地址,或者,如果您愿意,它是a的地址的地址。 float,这与说它是一个指向浮点数的指针的指针相同。