easy software

C언어 구조체를 swap하기(구조체를 가리키는 포인터 변수) 본문

C언어/구조체

C언어 구조체를 swap하기(구조체를 가리키는 포인터 변수)

JAVA 웹개발자 2015. 2. 6. 23:55

struct person{
     char name[20];
     char pID[20];
     struct person* frnd;
};

 

person이라는 구조체를 만들었습니다.

 

그런데 멤버로 person본인을 가리킬 수 있는 frnd라는 변수가 있네요.

 

C언어는 이러한 구조를 허용합니다.

 

 

 

struct person man1;

struct person man2;

man1.frnd = &man2;

 

위의 코드를 실행하면 아래와 같은 구조가 됩니다.

 

 

frnd이 man2를 가리케게 되는 것이죠.

 

그럼 구조체를 가리키는 포인터 변수를 알아봤으니 문제를 하나 해결해 볼까요?

 

내용은 간단합니다.

 

struct person{
     char name[20];
     char pID[20];
     struct person* frnd;
};

 

위 구조체 변수 두개를 인자로 전달받아서,

 

서로가 지니고 있는 값을 변경해 주는 swap함수를 구현해 보는 것입니다.

 

 

#include <stdio.h>

 

void swap(struct person* sman1, struct person* sman2);

 

//person구조체 변수를 가리킬 수 있는 person*형 포인터 변수를 포함
struct person{
     char name[20];
     char pID[20];
     struct person* frnd;
};

 

int main(void){
     struct person man1 = { "Mr. Lee", "820204-0000512" };
     struct person man2 = { "Mr. Lee' s Friend", "820000-0000101" };

 

     printf("swqp함수 호출 전\n\n");

 

     printf("[Mr. Lee]\n");
     printf("name : %s\n", man1.name);
     printf("pID : %s\n\n", man1.pID);

 

     printf("[His Friend]\n");
     printf("name : %s\n", man2.name);
     printf("pID : %s\n\n\n", man2.pID);

 

     swap(&man1, &man2);//구조체들의 실제 저장된 값을 변경

 

     printf("swqp함수 호출 후\n\n");

 

     printf("[Mr. Lee]\n");
     printf("name : %s\n", man1.name);
     printf("pID : %s\n\n", man1.pID);

 

     printf("[His Friend]\n");
     printf("name : %s\n", man2.name);
     printf("pID : %s\n\n\n", man2.pID);

 

     return 0;
}

 

//구조체변수의 값을 교환시켜주는 함수
void swap(struct person* sman1, struct person* sman2){
     struct person sman3;

 

     sman3 = *sman1;
     *sman1 = *sman2;
     *sman2 = sman3;
}

 

 

코드 라인이 좀 길어보이지만 printf함수 호출을 빼면 별거 없습니다.

 

하나씩 분석해 볼까요?

 

main함수에서 person의 변수에 값을 초기화 시키고 있습니다.

 

그 후 변경전 구조체 값을 출력해 주고 있네요.

 

후에 swap함수를 호출합니다.

 

swap함수에서는 sman1과 sman2를 선언하여 인자를 가리키고 있습니다.

 

 

 

sman3이라는 person형 변수를 생성하여 sman1이 가리키는 값(man1)을 저장합니다.

 

sman1이 가리키는 값에는 sman2(man2)가 가리키는 값을 저장합니다.

 

마지막으로 sman2가 가리키는 값에는 sman1이 가리키는 값이었던 sman3를 저장합니다.

 

그 후에 출력을 해보면 실제로 값이 변경된 것을 확인할 수 있습니다.

Comments