티스토리 뷰

반응형

함수의 인자로 구조체 전달하기


함수 호출에 의한 구조체 변수의 전달은 크게 두 가지로 나누어 집니다. 하나는 값에 의한 전달 (Call-By-Value)이고 다른 하나는 주소 값에 의한 전달(Call-By-Reference)입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void show(struct Data st);        //Call-By-Value
void swap(struct Data* st);        //Call-By-Reference
 
struct Data    
{
    int data1;
    int data2;
};
int main()
{
    Data st1 = { 10,20 };
 
    show(st1);                //Call-By-Value
    swap(&st1);                //Call-By-Reference
    show(st1);                //Call-By-Value
 
}
void show(struct Data st)    //구조체 멤버 변수 값 출력
{
    printf("%d %d\n", st.data1, st.data2);
}
void swap(struct Data* st)    //data1 과 data2 스왑
{
    int tmp;
    tmp = st->data1;
    st->data1 = st->data2;
    st->data2 = tmp;
}

 

함수 호출로 인한 구조체 변수 인자 전달로 두 가지 방식으로 구현 하였습니다. show 함수는 값에 의한 전달이며 swap 함수는 주소값에 의한 전달 방식입니다. 먼저 show 함수의 경우 인자로 구조체 변수의 이름으로 전달이 이루어지며 매개변수도 구조체 변수로 받고 있습니다. 반면에 swap 함수의 경우는 인자로 구조체 변수의 주소 값을(&st1)을 전달하고 매개 변수로 구조체 포인터 변수로 받고 있습니다.

 

구조체 변수의 연산


기본 자료형 변수들은 사칙 연산을 비롯해서 비교 연산 등 다양한 형태의 연산이 가능합니다. 반면, 구조체의 경우는 다른 기본 자료형 변수들에 비해 제한적입니다. 기본적으로 구조체 변수가 허용하는 연산은 대입연산입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Data    
{
    int data1;
    int data2;
};
int main()
{
    Data st1 = { 10,20 };
    Data st2 = st1;        // 대입연산
    show(st2);
 
}
void show(struct Data st)    //구조체 멤버 변수 값 출력
{
    printf("%d %d\n", st.data1, st.data2);
}

 

11번 라인에서 st1을 선언하고 각각 10과 20으로 초기화 하고 있습니다. 반면에 12번 라인에서는 st2를 선언하고 st1을 대입을 하고 있습니다. 이렇게 되면 st1의 구조체 멤버 값이 st2에 복사가 됩니다. 즉 st1의 data1의 값이 st2의 data1에 복사가 되고 st1의 data2의 값이 st2의 data2에 복사가 이루어집니다.

 

구조체 변수의 리턴


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void show(struct Data st);        //Call-By-Value
Data getdata();
 
struct Data    
{
    int data1;
    int data2;
};
int main()
{
    Data st1 = { 10,20 };
    Data st2 = getdata();
 
    show(st1);
    show(st2);
 
}
void show(struct Data st)    //구조체 멤버 변수 값 출력
{
    printf("%d %d\n", st.data1, st.data2);
}
Data getdata()                //반환형이 struct Data이며 전달받는 인자는 없음
{
    struct Data data;
    scanf_s("%d %d", &data.data1, &data.data2);
    return data;            //구조체 반환
}
 

 

반환형이 struct Data 형이고 매개변수를 가지지 않는 getdata 함수를 구현 하였습니다. 12번 라인에서 st2를 선언하고 대입연산자 오른쪽에서 getdata()함수를 호출하고 있습니다. getdata 함수는 Data 구조체의 멤버 변수를 초기화하고 초기화한 구조체를 반환값으로 넘겨주게 됩니다. 최종적으로 st2에 반환된 구조체 값이 복사가 됩니다.

 

반응형