2016-08-25 2 views
-2
struct LinkedList 
{ 
    int data; 
    struct LinkedList *next; 
}; 

코드에서 struct LinkedList의 정의 내에 구조 자체에 대한 포인터가 있습니다. 어떻게 작동합니까?C에서 자기 참조 포인터 란 무엇입니까?

+0

타입이 호환되지 않기 때문에 C에서 자기 참조 * 포인터는 불가능합니다.'int * p = & p;'& p'의 타입은'int **'입니다. – Kninnug

+1

귀하의 C 서적은 무엇을 말합니까? 'struct' 정의와 포인터에서 그 점에서 배워야 만했던 것에서 구체적으로 추론 할 수없는 것은 무엇입니까? 당신이 한 경우 : 수업을 건너 뛰지 마십시오! – Olaf

+1

http://stackoverflow.com/questions/18451788/pointer-to-structure-and-self-pointers – Arun

답변

4

따라서 코드

struct LinkedList 
{ 
    int data; 
    struct LinkedList *next; 
}; 

동일한 유형의 다른 객체의 주소를 기억 next 부재와, 두 개의 부재 datanext라는 함유 구조체 타입을 정의한다. 코드를 감안할 때 :

struct LinkedList Node1 = { .data = 1, .next = NULL }; 
struct LinkedList Node0 = { .data = 0, .next = &Node1 }; 

당신이 종류의 다음과 같습니다 뭔가 얻을 :

Node0    Node1 
+---+--------+ +---+------+ 
| 0 | &Node1 |--->| 1 | NULL | 
+---+--------+ +---+------+ 

(당신이 결코 링크 된 목록이 길을 만들 것이라고합니다, 이것은 단지 그림을 위해입니다).

는 두 가지 이유가있다 :

  1. C는 불완전 유형에 대한 포인터를 선언 할 수 있습니다;
  2. struct 유형의 포인터는 모두 크기와 표현이 같습니다.

이것은 자체 참조 데이터 유형의 예이며, 유형이 동일한 유형의 다른 객체에 대한 참조 (포인터)를 저장한다는 것을 의미합니다.

1

일부인 주소를 가리키는 자체 참조 포인터입니다. 따라서 예를 들어,

typedef struct node {  
    char data[30]; 
    struct node *this; 
    struct node *next; 
} Node; 

*이 항목은 적용되는 항목에 할당 된 경우 자체 참조 포인터입니다. 그것은 끝없는 재귀수록

명확 셀은 다른 셀을 포함 할 수 없습니다.

그러나 셀에는 다른 셀에 대한 포인터가 포함될 수 있습니다.

this post도 참조하십시오.

+1

유일한 자기 참조 포인터는'void * '입니다. 법적으로 다른자가 참조 포인터는있을 수 없습니다! – Olaf

+1

네 동생, 당신은 http://stackoverflow.com/questions/588623/self-referential-struct-definition – Vikrant

+1

@Olaf를 통해 갈 수 있습니다. 그러나 참조 자체로 재귀를 피할 수 있습니다. 매우 영리한 ! :) – Vikrant

3

당신이 말하는 것은 재귀 데이터 구조체이며 질문은 데이터 구조 자체를 참조하는 방법입니다.

C에서 이것은 데이터 구조의 정의에서 자체에 대한 포인터를 선언함으로써 수행 될 수 있습니다. "self"는 자체 유형의 것을 의미합니다.

식을 쓸 때 데이터 구조가 아직 완료되지 않았습니다. 따라서 정의가 아직 완전히 알려지지 않았기 때문에 한 번만 데이터 구조에 자신의 발생이 포함되도록하는 것은 불가능합니다. 왜냐하면 데이터 구조가 자체 자체의 발생을 포함하는 결말이 결코 없기 때문입니다 ...

그러나 자체에 대한 포인터를 선언 할 수 있습니다. 컴파일러는 이제 포인터에 대한 저장소 만 할당하고 나중에 포인터를 할당/참조 해제하면 지시 된 저장소가 자체 발생을 포함한다는 것을 알게됩니다. 그것이 당신의 예에서 당신이하는 것입니다.