2013-07-17 3 views
-1

Я пытаюсь узнать о указателях на языке C и не понимаю, почему оператор унарного * был добавлен в конец слова «узел» в следующем фрагменте кода:размещение унарного оператора при использовании указателей в C

struct node* CopyList(struct node* head) { 
    /* code here */ 
} 

из моего понимания указателей, можно создать указатель с заявлением, как

int *pointerName; 

и назначить «pointee» к нему с заявлением, как

pointerName = malloc(sizeof(int)); 

и затем разыменования указателя с заявлением, как

*pointerName = 4; 

, который будет хранить целое значение 4 в 4 байта памяти (pointee местоположения), которая «указывает на» указателем pointerName.

С этим сказанным, что это значит, когда * добавляется к концу слова, как это с

struct node* 

???

Заранее благодарен!

http://cslibrary.stanford.edu/103/

+2

Это возвращаемый тип функции: он возвращает указатель на 'struct node'. – Maroun

+0

Возвращает указатель на узел struct. Это не оператор разыменования. – hetepeperfan

+2

Не задействован «унарный оператор». Пожалуйста, найдите хороший учебник С. –

ответ

1

struct node* CopyList

Чтобы лучше понять, вы должны читать справа налево. Который говорит, что CopyList - это функция, возвращающая указатель на узел.

1

int *pointerName; такое же, как int * pointerName; или int* pointerName;. Тип данных: int* во всех этих случаях. Итак, struct node* - это просто указатель на struct node.

0

node* означает, что следующая функция/переменная/структура имеет тип «указатель на тип узла».

3

Адрес * игнорирует пробел между базовым типом и именем переменной. То есть:

int* foo; // foo is pointer-to-int 
int *bar; // bar is also pointer-to-int 

В обоих случаях тип переменной является «pointer-to-int»; «pointer-to-int» является допустимым типом.

Вооружившись этой информацией, вы можете видеть, что struct node* является тип, этот тип является «указателем на узел-структура». Наконец, таким образом, вся линия

struct node* CopyList(struct node* head) 

означает «CopyList функция принимает указатель-to struct node (так называемый head) и возвращает указатель-to struct node»

+0

Я предпочитаю помещать '*', как во втором примере, чтобы указать, что указатель 'bar', поэтому, когда у вас есть' int * p_bar, bar; 'вы не будете путать кого-то указателем, а кто нет. – Maroun

+0

Я думаю о том, что есть объект, который мне действительно волнует. Я бы использовал первый стиль, если «foo» - это то, о чем я забочусь (foo - это указатель на int или, возможно, указатель на целый массив ints). Я бы использовал второй стиль, если «bar» - это то, о чем я забочусь (* bar - это int). – gnasher729

1

Вы можете использовать «* 'либо с типом, либо с именем функции/переменной.
Но предполагается использовать его с возвращения типа декларируя методы, как показано ниже

struct node* CopyList(struct node* head) { 
    /* code here */ 
    } 

при объявлении указателей с использованием типа * с именем переменной ., как показано ниже,

int *ptr; 

Объявив таким образом повышает читаемость.

Для примера рассмотрим этот случай,

int* a,b,c; 

Приведенное выше утверждение появляется как объявить три указателя переменных базового типа целого числа, на самом деле мы знаем, что он равен

int *a; 
    int b,c; 

Сохраняя оператор * рядом с типом данных возникает путаница здесь, поэтому следующий путь повышает читаемость, но не стоит использовать * в любом случае.

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