2013-12-20 4 views
-2
#include <stdio.h> 
#include <stdlib.h> 

struct stud 
{ 
    int age; 
    struct stud *next; 
}; 

typedef struct stud node; 

node *createlist(); 
void main() 
{ 
    node *head; 

    head = createlist(); 
} 

node *createlist() 
{ 

    node *head, *p; 

    head = (node *) malloc(sizeof(node)); 

    int i, n; 

    printf("Enter the number of elements\n"); 
    scanf("%d", &n); 

    for (i = 0; i < n; i++) 
    { 
     if (i == 0) 
     { 
      p = head; 
     } 
     else 
     { 
      p->next = (node *) malloc(sizeof(node)); 
      p = p->next; 
     } 
     p->age = i;    /* This line here - what happens with (*p).age = i; or 
            &p->age = i; */ 
    } 

    p->next = NULL; 
    return head; 
} 

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

(*p).age = i; 

и

&p->age = i; 

В основном я создаю Связанный список структуры стад и я пытаясь инициализировать некоторые значения его членам.

+2

Ну, один будет компилироваться, а другой - нет. Что вы на самом деле хотите сделать? Испытание и ошибка - это не путь вперед. –

+3

Является ли ваш реальный вопрос, какая разница между '(* p) .age' и' p-> age'? Что это касается всего кода, который вы публикуете? Почему вы не можете сконденсировать свой вопрос в достойный вопрос? –

ответ

5

Ваш текущий код

p->age = i; 

Это идентично

(*p).age = i; 

С другой стороны,

&p->age = i; 

ошибка компиляции.

Поскольку -> имеет более высокий приоритет, чем &, что анализируется как

&(p->age) = i; 

И вы не можете назначить int к int*, не говоря уже тот факт, что &(p->age) не является именующей.

-1

Оба получат доступ к элементу конструкции age.

Но &p->age = i; вызовет ошибку времени компиляции.
-> имеет более высокий приоритет, что Унарное & оператора, так что компилятор интерпретирует это как

&(p->age) = i; 

В & результаты оператора в г-значение, &(p->age) станет г-значение.
Как Стандарт говорит:

Оператор присваивания должен иметь изменяемую именующее выражение в качестве левого операнда.

Этот оператор вызовет ошибку времени компиляции.

+1

Как указано другими, '& p-> age = i' является ошибкой компиляции. – TypeIA

+0

@DavidNorris; Отредактировал мой ответ. – haccks

+0

Я еще раз спрошу у downvoter, пожалуйста, оставьте свой комментарий. – haccks

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