Почему это утверждение правильно? & f имеет тип float ** - PullRequest
0 голосов
/ 08 ноября 2018

Я поднялся на этот вопрос: У меня есть следующая инструкция

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

и следствием этого является то, что

&f is of type float**

Я не понимаю, почему это так.

Ответы [ 5 ]

0 голосов
/ 08 ноября 2018

Как правило, тип выражения, как

&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.

0 голосов
/ 08 ноября 2018

У меня есть следующая инструкция

Эти штуковины называются "заявлениями".

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 указывает на область памяти, достаточно большую, чтобы вместить пять последовательных 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:

float *f = malloc(5 * sizeof(*f));  // or, instead of the result of malloc() simply
                                    // the address of some automatic float variable
float **ptr = &f;  // &f yields the address of the variable f.
                   // The type of f is (pointer to float) -> float*,
                   // so a pointer to it is of type (pointer to (pointer to float) -> float**
0 голосов
/ 08 ноября 2018

Указатель на объект содержит адрес объекта. В вашем случае f - это указатель на float, то есть значение f является адресом числа с плавающей запятой (при условии, что указатель недопустим). По расширению, &f - это адрес f, то есть адрес указателя на float, или, если вы предпочитаете, это адрес адреса с плавающей точкой, который совпадает с говоря, что это указатель на указатель на число с плавающей точкой.

0 голосов
/ 08 ноября 2018

Давайте начнем с более простого примера:

int a = 42;

в этом примере a в переменной, содержащей значение 42.

&a - адрес этой переменной. Может храниться в указателе:

int *b = &a;

Переменная типа int * является указателем на переменную типа int.

Вернуться к вашему вопросу:

В вашем случае тип f - это не int, а float*. Как следствие, тип &f равен float**.

0 голосов
/ 08 ноября 2018

Тип f равен float*, то есть указатель на число с плавающей точкой. Таким образом, &f является адресом f, поэтому его тип - это адрес указателя с плавающей точкой, то есть указатель на указатель с плавающей точкой, что означает float**.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...