2013-07-22 2 views
1

C 언어로 연결된 목록에서 일부 작업을 시도하고 있습니다. 나는 초보자이며 일종의 기능으로 혼란 스럽다. append().포인터의 ** 의미 - C 언어

그들은 struct node **q과 같은 함수에서 인수를 전달했습니다. 그리고 그들은 *q과 함께 사용하고 있습니다. C 언어

기능 append() :

void append(struct node **q, int num) { 
    struct node *temp, *r; 
    if(*q==NULL) { 
     temp=malloc(sizeof(struct node)); 
     temp->data=num; 
     temp->link=NULL; 
     *q=temp; 
    } 
    else { 
     temp=*q; 
     while(temp->link!=NULL) 
      temp=temp->link; 
     r=malloc(sizeof(struct node)); 
     r->data=num; 
     r->link=NULL; 
     temp->link=r; 
    } 
} 

나는 이해할 수 없습니다입니다 : -

  1. 가 코드 부분의 인수에 **q*q를 사용하는 이유는 무엇입니까?
  2. 차이점은 무엇입니까? 및
  3. 가장 좋은 방법은 무엇입니까?

어떤 도움을 주시면 감사하겠습니다.

+0

첫 번째 고지 한 단어를 변경하지 않고도 질문을 전한 방법. 두 번째는 기능적으로 현명한 append() 함수 ** ** ** –

+0

이 맞는지 여부와 질문 번호 -2가 질문 번호 -1이어야하는지 여부를 알려줍니다. –

답변

3

C의 인수는 값이 인 으로 전달된다는 것을 기억하십시오. 즉, 값이 복사됩니다. 따라서 함수에서 인수를 변경하려면 으로 전달해야합니다. C에서는 포인터를 사용하여이 작업을 수행합니다. 그러나 함수 자체에 전달할 때 포인터 자체는 이고 값은이므로이 포인터를 변경하려면 을 참조로 전달해야하므로이 포인터를 포인터에 대한 포인터로 전달해야합니다. 특정 코드에 대한


는 기능 append은 최고를 통과 포인터를 수정하고, 그래서 당신은 포인터의 주소로 참조를 전달해야합니다.

struct node *queue; 
append(&queue, ...); 

그런 다음 append 반환, q이 변경 될 수 있습니다 때 호출자는 같은 작업을 수행합니다. 단항 연산자 * 포인터에 대한 역 참조 때문


함수에 *q의 사용이다. 따라서 포인터가 q 인 경우 *qq을 가리키는 값이됩니다. 함수의 경우 q이 포인터 포인터이므로 *q은 원래 포인터가됩니다.

위의 짧은 발췌 문장을 사용하여 호출하면 *qqueue 포인터를 반환합니다.

0

에서 append()까지의 주소를 으로 전달하도록 설계되었습니다.

임 확신,

int main() 
{ 

struct node *k; 

//calling append() function. 
append(&k); 

} 

몇 가지 간단한 예를 들어 여기를 참조하십시오, 다음과 같이 호출됩니다 추가합니다. http://www.cplusplus.com/forum/general/13227/

0

** q는 q가 다른 포인터를 가리키는 포인터라는 것을 의미합니다. p. q를 사용하여 p 값을 얻고 싶다면 ** q와 같이 사용해야합니다. * q는 p의 주소가 될 q의 값을 가리 킵니다 .Again a *는 p의 값을 가져옵니다.

0

포인터의 개념을 잘 이해해야합니다. 일반적으로 포인터를 작업하는 경우 * 연산자을 사용하여 해당 포인터의 값에 액세스 할 수 있습니다.

예 : 여기

x=10; //Assume Memory Address of x is 1000. 1000 holds value 10 
int *y=&x; //Assume Memory address of y is 1100. 1100(y) holds pointer value 1000 

,

y will hold 1000 
*y => value at y => value at 1000 => 10  

이 구조는 다음과 같습니다 보자.

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

처음에는 대기열이 비어 있습니다.

//Initially queue is empty. 
struct node *queue=NULL; 
append(&queue,10); //append(4000,10); 

여기 큐의 어드레스 4000

4000 => queue => holds value 0 

그래서 여기 4000 큐의 시작을 가지고 있다고 가정. 큐가 비어 있으므로 0을 유지합니다.

여기서 첫 번째 노드 주소를 가져 오려면 4000 값에 액세스해야합니다. 따라서 포인터 (현재 0)를 가리키는 포인터 (4000)에 액세스하려고합니다. 이 경우 이중 포인터를 사용하므로 선언은 ** q이됩니다.

void append(struct node **q, int num) 

여기 Q 4000 것 * Q에서 Q => NULL 값 (제로)이다. 블록을 가져옵니다.

if(*q==NULL) //*q => value at q is NULL(Zero) 
{ 
    temp=malloc(sizeof(struct node)); //assume temp=3000 
    temp->data=num; //3000->data=10 
    temp->link=NULL; //3000->link=NULL; 
    *q=temp; //*q => value at q => value at 4000 is 3000 now. 
} 

지금 목록이 비어 있지 않은 경우, 다른 블록에서 작동합니다 다시

append(&queue,20); //append(4000,20); 
4000 => queue => holds value 3000 //updated address in queue 

를 추가 호출.

temp=*q; // temp= value at q => 3000 
//Iterate from 3000 to traverse the list and add num in the end.