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中获取一些信息 为了避免这种情况。