C 为什么这个说法是正确的&f为浮点数型**

C 为什么这个说法是正确的&f为浮点数型**,c,pointers,malloc,C,Pointers,Malloc,我提出了这个问题: 我有以下指示 float *f = (float*) malloc(5*sizeof(float)); 其结果是 &f is of type float** 我不明白为什么会这样。f的类型是float*,即指向float的指针。So&f是f的地址,所以它的类型是指向浮点指针的地址,也称为指向浮点指针的指针,意思是浮点**。f的类型是浮点*,即指向浮点的指针。所以&f是f的地址,所以它的类型是指向float指针的地址,也就是指向float指针的指针,意思是float

我提出了这个问题: 我有以下指示

float *f = (float*) malloc(5*sizeof(float));
其结果是

&f is of type float**

我不明白为什么会这样。

f的类型是float*,即指向float的指针。So&f是f的地址,所以它的类型是指向浮点指针的地址,也称为指向浮点指针的指针,意思是浮点**。

f的类型是浮点*,即指向浮点的指针。所以&f是f的地址,所以它的类型是指向float指针的地址,也就是指向float指针的指针,意思是float**。

指向对象的指针包含对象的地址。在您的例子中,f是一个指向float的指针,也就是说f的值是一个浮点数的地址,假设指针不是无效的。
通过扩展,那么&f是f的地址,也就是说它是指向浮点的指针的地址,或者如果您愿意,它是浮点地址的地址,这与说它是指向指向浮点数的指针相同。

指向对象的指针包含对象的地址。在您的例子中,f是一个指向float的指针,也就是说f的值是一个浮点数的地址,假设指针不是无效的。 通过扩展,那么&f是f的地址,也就是说它是指向浮点的指针的地址,或者如果您愿意,它是指向浮点的地址的地址,这与说它是指向指向浮点数的指针相同。

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

在本例中,a位于包含值42的变量中

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

int *b = &a;
int*类型的变量是指向int类型变量的指针

回到你的问题:

在您的例子中,f的类型不是int而是float*。因此,&f的类型是float**。

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

在本例中,a位于包含值42的变量中

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

int *b = &a;
int*类型的变量是指向int类型变量的指针

回到你的问题:

在您的例子中,f的类型不是int而是float*。因此,f&f的类型为浮动**

我有以下指示

float *f = (float*) malloc(5*sizeof(float));
这些东西叫做陈述

不要强制转换malloc的结果:

float *f = malloc(5 * sizeof(float));
更好的方法是,通过分配内存的指针确定大小:

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

现在f指向一个足够容纳五个连续浮点的内存区域; 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:

我有以下指示

float *f = (float*) malloc(5*sizeof(float));
这些东西叫做陈述

不要强制转换malloc的结果:

float *f = malloc(5 * sizeof(float));
更好的方法是,通过分配内存的指针确定大小:

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

现在f指向一个足够容纳五个连续浮点的内存区域; 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:


通常,表达式的类型如下

&something
是指向某事物类型的指针。因为f的类型是*float,&f的类型必须是指向*float的指针,它被写为**float

相反,如果某物的类型是*sometype,即指向sometype的指针,那么*something的类型就是sometype。所以如果你有

float **f;

那么*f的类型是*float,而**f的类型是float。

一般来说,表达式的类型如下

&something
是指向某事物类型的指针。因为f的类型是*float,&f的类型必须是指向*float的指针,它被写为**float

相反,如果某物的类型是*sometype,即指向sometype的指针,那么*something的类型就是sometype。所以如果你有

float **f;

那么*f的类型是*float,而**f的类型是float。

顺便说一句,不。我不明白为什么会这样。->你认为&f是什么类型的?顺便说一句,不。我不明白为什么会这样。->你认为&f是什么类型的?只是想澄清一下,在你的例子中,ptr==&f、*ptr==NULL和**ptr==BAD?@FiddlingBits不,ptr并不坏。它保存变量f的地址,而不考虑f的值。是的,一次取消引用ptr将产生NULL,两次取消引用ptr将取消引用NULL指针,这是错误的。为了避免这种情况,我将更改示例,从malloc向其提供一些信息。为了清楚起见,在您的示例中,ptr==&f、*ptr==NULL和**ptr==BAD?@FiddlingBits不,ptr不坏。它保存变量f的地址,而不考虑f的值。是的,一次取消引用ptr将产生NULL,两次取消引用ptr将取消引用NULL指针,这是错误的。我将更改示例,从malloc中获取一些信息 为了避免这种情况。