2016-01-18 3 views
-8

Из того, что я видел, символ * обычно появляется перед переменной основных типов (например, int). Тем не менее, я наткнулся на строку кода, которая заключается в следующем:Синтаксис базового C-указателя

insert(int key, struct node **leaf) 
{ 
    if(*leaf == 0) 
     { 
     *leaf = (struct node*) malloc(sizeof(struct node)); 
     (*leaf)->key_value = key; 
     /* initialize the children to null */ 
     (*leaf)->left = 0;  
     (*leaf)->right = 0; 
    } 
    else if(key < (*leaf)->key_value) 
    { 
     insert(key, &(*leaf)->left); 
    } 
    else if(key > (*leaf)->key_value) 
    { 
     insert(key, &(*leaf)->right); 
    } 
} 

Как символ * работа, когда речь идет до структуры (например структура узла *.)?

Спасибо.

+4

Недавно я увидел символ * в этом коде: 'return 3 * 5;'. Я действительно удивляюсь, как *, который * работал; насколько я могу судить, 5 не является указателем. –

+1

Возможно, прочитайте любую книгу на c, а не ожидайте, что кто-нибудь напечатает что-то подобное, но не так подробно. –

+0

Я искал в Интернете (не могу позволить себе учебник прямо сейчас) для ответов. Я глубоко извиняюсь за то, что трачу ваше время иначе. – riceman89

ответ

1

* является двоичным и унарным оператором в C, а это означает разные вещи в разных контекстах.

на основе коды вы предоставили:

*leaf = (struct node*) malloc(sizeof(struct node)); 

Здесь void * (пустой указатель), который malloc возвращается в настоящее время литого указатель на struct node, я не рекомендую этого, для получения более подробной информации читайте this

Я думаю, если вы видите декларацию листа он будет выглядеть следующим образом:

struct node ** leaf; //declares a pointer to a pointer of struct node 

leaf = malloc(sizeof(struct node *)); //allocate enough memory for pointer 
//remember to not cast malloc in C 

На данный момент *leaf является указателем на struct node, где * действует как оператор разыменования.

+0

Спасибо за подробный ответ. Я не видел этого как тип, но он очень ясен, что это сейчас. Приветствия за очень полезное объяснение! – riceman89

1

leaf как указатель на указатель. Это означает, что он указывает на указатель в памяти. И * оператор разыскивает свой операнд. Таким образом, *leaf означает значение указателя, на которое указывает leaf. Фактически, как я вижу, эта структура связана с древовидной структурой данных. Этот код фактически выделяет память для того, где (место в памяти) leaf указывает на:

*leaf = (struct node*) malloc(sizeof(struct node)); 

struct node является определенный пользователем тип и struct nod * означает тип указатель, ссылающийся на переменную типа struct node.

+0

"*' leaf' как указатель на указатель. * "Как вы узнали об этом? Из показанного кода - это просто указатель, указатель на что угодно, OP не указывает, к какому типу он указывает. – alk

+0

Он задает значение, где 'leaf' указывает на' struct node * ', поэтому' leaf' является 'struct node **' –

+0

Это ваше предположение, разумное, да – alk

Смежные вопросы