2010-06-06 8 views
2

죄송합니다.이 질문이 전에 요청 된 경우. 그래서 내 검색에서 나는 내가 알고 싶은 것을 물어 본 사람을 찾지 못했습니다. 나는이 때포인터 초기화

기본적으로 :

typedef struct node 
{ 
    int data; 
    node *node; 
} *head; 

와 내가 선언과 공간을 확보하지만, struct node에 대한 포인터를 정의하고 있지 않다 인상입니다 node *newItem = new node;

을 올바른 것입니다 ? 내가

newItem->data = 100newItem->next = 0

을 수행 할 때

그래서 나는 혼란스러워. newItem = 0 정확히 무엇을 선언하겠습니까? datanext? 전체적으로 개체?

typedef를 사용할 때 특히 혼란 스럽습니다. 어떤 부분이 매크로입니까? 내가 노드라고 생각하기 때문에 그렇게 부르지 만, 왜 내가 필요합니까?

마지막으로, 내가 무엇을 할 때 발생합니다

node *temp; 
temp = new node; 

temp = head->next; 
head->next = newItem; 
newItem->next = temp; 

내 말은, 머리 -> 다음 인 newItem 객체를 가리키는 포인터이다, 그래서 나는 newItem.data 또는 자신 옆에하지 가정합니다. 그렇다면 위에 설명 된 초기화되지 않은 포인터를 여기에서 안전하게 사용하려면 어떻게해야합니까? 머리가 초기화되지 않은 포인터를 가리키고 있지 않습니까?

내가 선언과 공간을 예약 오전 인상입니다

답변

9

있지만 노드를 구조체에 포인터를 정의, 수정 입니까?

아니요. 포인터를 선언하고 포인터의 스택에 공간을 할당하고 노드의 저장소를 동적으로 할당합니다.

같은 물건을 작성하여 자신을 혼동하지 마십시오 :

typedef struct node 
{ 
    int data; 
    node * next; 
} *head; 

방법을 C에서 구조체를 작성 ++입니다 :

node * pnode; 
:

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

이제 포인터를 만들 수 있습니다

포인터에 대한 저장소를 할당합니다. 하나에 모든 것을

pnode = new node; 

또는 수행 :

및 동적 노드에 대한 스토리지를 할당하고 포인터 지점을 만들 수 있습니다

node * pnode = new node; 

을 이제 말할 때 :

pnode->data = 10; 

아무 것도 할당하지 않습니다. 10을 pnode이 가리키는 노드 인스턴스의 data이라는 구성원에 지정합니다. 당신이 당신의 노드 생성자를 (당신이 일반적으로해야하는) 준 경우에, 당신은 하나에 모든 것을 할 수 있습니다 :

struct node 
{ 
    int data; 
    node * next; 

    node(int n, node * np) : data(n), next(np) {} 
}; 

node * pnode = new node(10, 0); 
3
node *newItem = new node; 

를 만들 :

  • 새로운 노드에 이 새로운 노드를 가리키는 스택에()
  • 포인터를 생략하기 때문에 귀하의 경우 초기화되지 않은 값을 포함하는 힙 (.

    당신은 당신이 그랬던 것처럼 당신의 구조체를 정의하고 당신이했던 것처럼 new를 호출 할 때 newItem-> 데이터 = 100

단순히 당신이 무슨 일을하는지, (100)

3

에 새로 할당 된 노드의 data 멤버를 설정 is :

  1. struct node을 힙에 할당하십시오.
  2. 스택에 newItem에 대해 공간을 할당하고 할당 한 새 구조체의 주소로 값을 설정하십시오.

의 새 구조체 멤버 중 임의의 값을으로 설정하지 않았습니다. 구조체의 새 인스턴스를 만들 때마다이 작업을 수행하려면 생성자를 정의해야합니다.

3
typedef struct node 
{ 
    int data; 
    node *node; 
} *head; 

이 구조체로 node을 선언하고 node*의 동의어로 head을 정의, 그래서 head는 타입이 아니라 개체입니다.

이렇게하면 ->이 유형에 적용 할 수있는 것이 아니기 때문에 temp = head->next;이 아닙니다.

new nodenode 개체를 동적으로 할당하고 그에 대한 포인터를 반환합니다. node *newItem = new node;은이 포인터를 newItem에 할당합니다. 하지만 newItem->node (여기서 node은 포인터 객체이고 node 유형이 아님)은 초기화되지 않았으므로 null도 아니고 유효한 node 객체를 가리 키지 않습니다.

node에는 next 회원이 없기 때문에 이것은 또한 불법입니다.

newItem->next = temp; 

유형 및 변수를 구분하지 않도록 명명 규칙을 선택하는 것이 좋습니다. 그것은 다소 혼란 스럽습니다.