2014-01-16 2 views
3

struct example *e이있는 경우 function(&e)function(e)의 차이점은 무엇입니까?구조체 예제 * e : 함수 (& e)와 함수 (e)의 차이

예.

이 첫 번째 코드이다

#include <stdio.h> 

struct example 
{ 
    int x; 
    int y; 
}; 

void function (struct example **); 

int main() 
{ 
    struct example *e; 

    function (&e); 

    return 0; 
} 

void function (struct example **e) 
{ 
    /* ... */ 
} 

는 그리고이 두 번째 코드는 다음 두 코드 사이의 차이가 무엇

#include <stdio.h> 

struct example 
{ 
    int x; 
    int y; 
}; 

void function (struct example *); 

int main() 
{ 
    struct example *e; 

    function (e); 

    return 0; 
} 

void function (struct example *e) 
{ 
    /* ... */ 
} 

? 감사합니다.

답변

7

첫 번째에는 구조체에 대한 포인터의 주소를 전달합니다. 두 번째에서 struct의 주소를 전달합니다. 두 경우 모두 function 구조를 변경할 수 있습니다에서

당신은 그것을 통과 :

(*e)->x = 10; // First, needs additional dereferencing *. 

e->x = 10; // Second. 

를 처음에, 당신은 또한 또 다른 구조체의 주소를 할당, main()e 다른 값을 줄 예를 들어 수, 또는 NULL로 설정 :

*e = NULL; 

을 실제로 잊고있는 세 번째 경우 :

,691를
function(struct example e) { ... } 

여기서 함수는 전달한 구조체의 복사본을 가져옵니다.

+1

두 번째 경우에 'e = malloc (2 * sizeof (struct example))'을 함수에 넣을 수 있습니까? –

+1

@user 당신은 할 수 있지만, 함수에서'e' 만 로컬로 변경할 것입니다. 함수 매개 변수'e'는 값에 의해 전달됩니다. –

+1

좋아, 첫 번째 경우에는'* e = malloc (2 * sizeof (struct example))'을 실행하면'main()'에서도 변경됩니다. 맞습니까? –

2

첫 번째 예제는 'e'자체를 변경할 수 있습니다 (예 : Malloc()). 두 예제 모두 'e'가 malloced 인 경우 내용을 변경할 수 있습니다.

+1

_ @ Peter Miehle_. 예를 들어,'* e = malloc (2 * sizeof (struct example));과 같은 첫 번째 코드에서 malloc을 할 수 있다는 것을 의미합니까? –

1

the structure은 "구름"에 있습니다. 여러분은 그것에 대한 포인터를 다루고 있습니다. 포인터는 간단한 변수로 주소는 the structure입니다. 첫 번째 예에서는 the pointerthe structure을 변경할 수 있습니다. 두 번째 예제에서 the structure 만 변경할 수 있지만 a pointer (로컬 복사본) 만 변경할 수 있습니다.

두 번째 예 e = malloc ...에서 할 때, the structure은 "구름"에 존재하는 계속,하지만 당신은 function이 (= 메모리 누수를) 완료 될 때 어떤 연결이 끊어있는 새로운 하나를 만들 수 있습니다. main의 측면에서 모든 것은 변경되지 않습니다.

C++에서는 두 번째 예제 인 void function (struct example *&e)을 첫 번째와 같지만 "pointer-to-pointer"e (참조가 자동으로 역 참조하는 일종)의 자동 dereferenciation과 같은 방식으로 변경할 수 있습니다. 포인터).