2016-01-12 2 views
-1
#include<stdio.h> 
#include<stdlib.h> 
struct test 
{ 
    int data; 
    struct test *next; 
}; 
void main() 
{ 

    struct test *head=(struct test *)malloc(sizeof(struct test)); 
    struct test **ref=&head; 

    head->data=5; 
    head->next=NULL; 
    printf("\n %d \n %d",head->data,head->next); 
    printf("\n %d \n %d",**ref->data,**ref->next); 



} 

Объяснение:Ĉ указатели двойные указатели

Я попытался выше фрагмент кода.

Не **ref такой же, как *head? Если не так?

Кроме того, компилятор бросает ошибку на втором printf говоря, что data и next не являются частью structure или union.

+1

Добро пожаловать в переполнение стека! [Пожалуйста, ознакомьтесь с этим обсуждением, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+1

без какого-либо аспекта программирования, в случае '** ref так же, как * head', то почему вы считаете, что дополнительный' * 'есть вообще? –

+0

Другими словами, у вас есть слишком много '*' в вашей версии 'printf (" \ n% d \ n% p ", (* ref) -> data, (* ref) -> next);' и вам необходимо окружить указатель в скобках, чтобы применить правильное приоритет оператора. –

ответ

3

У вас есть две ошибки, одна синтаксическая (вы используете обозначение стрелки, когда вы должны использовать точечную нотацию), а другая - operator precedence.

Операторы выбора -> и . имеют более высокий приоритет, чем оператор разыменования *. Это означает, что выражение **ref->data эквивалентно **(ref->data). Это, конечно, нонсенс и не будет строить, поскольку data не является указателем.

У вас есть два варианта:

  1. использования, например, (*ref)->data
  2. Использование, например. (**ref).data.

Я бы с вариантом 1, как ref «ссылки» а указатель к структуре, что синтаксис более рядный с тем, что вы делаете, ИМО.


На несвязанной ноте, вы не должны использовать формат "%d" при печати указателей, вы должны использовать "%p". См. this printf (and family) reference.

1

**ref является указателем к указателю на struct test, *head является указателем на struct test.

ошибки есть, потому что при х ссылках, **ref имеет типа struct test и вы должны использовать точку ., чтобы добраться до члена структуры:

(**ref).data 

head является указателем на struct test, и вы можете правильно использовать оператор ->.

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