C 언어에서는 구조체 변수 자체를 복사해 전달하는 대신, 구조체의 주소(포인터)를 함수의 인수로 넘기는 방식을 자주 사용합니다. 이 방식은 다음과 같이 동작합니다.
- 호출하는 쪽에서 구조체의 주소를 함수의 인수로 전달합니다.
- 함수 선언부(헤더)에서는 이 주소를 구조체 포인터로 받아 처리합니다.
구조체 주소 전달 방식의 장점
- 메모리 낭비가 없습니다. 값에 의한 호출(Call by Value)처럼 구조체 전체를 복사할 필요가 없어, 큰 구조체를 다룰 때 특히 효율적입니다.
- 값을 다시 반환할 필요가 없습니다. 함수 내부에서 포인터를 통해 원본 구조체에 간접적으로 접근할 수 있으므로, 함수 안에서 수정한 내용이 그대로 반영됩니다.
예제 코드
다음 예제는 날짜 정보를 담는 구조체의 주소를 display() 함수에 전달하고, 포인터 연산자(->)를 사용해 각 멤버에 접근하여 출력합니다.
#include<stdio.h>
struct date{
int day;
int mon;
int yr;
};
main (){
struct date d= {02,01,2010};
display (&d);
getch ();
}
display (struct date *dt){
printf("day = %d\n", dt->day);
printf("month = %d\n",dt->mon);
printf("Year = %d",dt->yr);
}실행 결과
day = 2 month = 1 Year = 2010
핵심 정리
위 코드에서 display(&d)는 구조체 변수 d의 주소를 전달하며, 함수 매개변수 struct date *dt가 이를 받습니다. 이후 dt->day, dt->mon, dt->yr처럼 화살표 연산자(->)를 사용해 구조체 멤버에 접근할 수 있습니다. 이처럼 주소를 전달하면 구조체 복사 오버헤드 없이 원본 데이터를 직접 조작할 수 있다는 것이 가장 큰 장점입니다.