본문 바로가기
컴퓨터/C, C++

[C언어] 구조체 변수 값 바꾸기, 두 구조체 변수 값 변경(swap 함수)

by 도도새 도 2021. 11. 23.

두 구조체 변수 값 바구기

 

오늘은 C언어 구조체에서, 두 구조체 변수의 값들, 즉 각 구조체 변수의 멤버 값들을 바꾸는 방법을 정리하겠습니다. 구조체 값들을 바꾸는 방법은 사실 일반적인 변수 값들을 바꾸는 것과 별 차이가 없습니다.

변수 값 바꾸기 정리 (링크)

다만, temp부분을 바꿀 두 구조체와 같은 구조체를 사용하는 구조체 변수로 선언해 줘야 한다는 차이 점이 있습니다.

 

1. 메인 함수 내에서 구조체 변수 스왑

 

예시 코드.

#include <stdio.h>

typedef struct person{
	char name[20];
	int age;
	char adress[20];
}person;

int main(void){
	person person1 = {"홍길동", 25, "우리집"};
	person person2 = {"임꺽정", 35, "길거리"};
	
	printf("person1 이름 : %s, 나이: %d, 주소: %s\n", person1.name, person1.age, person1.adress);
	printf("person2 이름 : %s, 나이: %d, 주소: %s\n", person2.name, person2.age, person2.adress);
	printf("두 값 바꾸기\n");
	
	person temp;
	temp = person1;
	person1 = person2;
	person2 = temp;
	
	printf("person1 이름 : %s, 나이: %d, 주소: %s\n", person1.name, person1.age, person1.adress);
	printf("person2 이름 : %s, 나이: %d, 주소: %s\n", person2.name, person2.age, person2.adress);
	return 0;
}

 

출력 결과

구조체 변수 값 변경

 

우선 person이라는 구조체를 선언했고, person1과 person2라는 구조체 변수에 다른 값들을 담았습니다. 그리고 person temp이라는 구조체 변수를 선언 후, 그것을 이용해 두 값을 바꾸었습니다. 

 

1. 메인 함수 바깥에서 구조체 변수 스왑

 

이번에는 swap이라는 함수를 생성해 메인 함수 바깥에서 두 구조체 변수의 값을 변경해 보겠습니다. 이것 또한 일반 변수의 swap과 별반 차이가 없습니다. 다만 temp을 생성할 때 구조체 변수로 생성해야 한다는 점과, 함수에서 인자를 받을 때 구조체임을 명시해줘야 한다는 정도의 차이가 있습니다.

 

예시코드.

#include <stdio.h>



typedef struct person{
	char name[20];
	int age;
	char adress[20];
}person;

void swap(person *first, person*second); 

int main(void){
	person person1 = {"홍길동", 25, "우리집"};
	person person2 = {"임꺽정", 35, "길거리"};
	
	printf("person1 이름 : %s, 나이: %d, 주소: %s\n", person1.name, person1.age, person1.adress);
	printf("person2 이름 : %s, 나이: %d, 주소: %s\n", person2.name, person2.age, person2.adress);
	printf("두 값 바꾸기\n");
	
	swap(&person1, &person2);
	
	printf("person1 이름 : %s, 나이: %d, 주소: %s\n", person1.name, person1.age, person1.adress);
	printf("person2 이름 : %s, 나이: %d, 주소: %s\n", person2.name, person2.age, person2.adress);
	return 0;
}

void swap(person *first, person*second){
	person temp;
	temp = *first;
	*first = *second;
	*second = temp;
};​

출력 결과

swap함수로 구조체 변수 값 변경

 

 swap함수 내부를 보자면, 우선 인자로 person1과 person2의 주소값을 받습니다. 그리고 temp이라는 구조체 변수를 생성하고, 첫번째 인자 주소를 역참조해 값을 불러와 temp에 담습니다. 그리고 바꾸기 과정을 통해 두 값을 변경하게 됩니다. 주소에 접근해 직접 값을 바꾸었기 때문에 swap함수를 벗어나도 바꾼 값이 원래대로 돌아가지 않습니다.

 

3. 나이만 바꾸어 보기

 

이번에는 C언어 구조체를 조금 더 연습하는 의미에서 두 구조체 변수의 이름만을 swap함수를 이용해 변경해 보도록 하겠습니다.

 

예시코드.

#include <stdio.h>



typedef struct person{
	char name[20];
	int age;
	char adress[20];
}person;

void swap(person *first, person*second); 

int main(void){
	person person1 = {"홍길동", 25, "우리집"};
	person person2 = {"임꺽정", 35, "길거리"};
	
	printf("person1 이름 : %s, 나이: %d, 주소: %s\n", person1.name, person1.age, person1.adress);
	printf("person2 이름 : %s, 나이: %d, 주소: %s\n", person2.name, person2.age, person2.adress);
	printf("두 값 바꾸기\n");
	
	swap(&person1, &person2);
	
	printf("person1 이름 : %s, 나이: %d, 주소: %s\n", person1.name, person1.age, person1.adress);
	printf("person2 이름 : %s, 나이: %d, 주소: %s\n", person2.name, person2.age, person2.adress);
	return 0;
}

void swap(person *first, person*second){
	int temp;
	temp = first->age;
	first->age = (*second).age;//second->age 와 *(second).age는 같은 의미 
	second->age = temp;
};

출력 결과

나이만 바꾸기

 

이번에는 .과 ->를 사용하여 함수 내에서 각 구조체 변수의 멤버에 접근해 값을 변경했습니다. 여기서 눈여겨 봐야 할 것이 바로 ->인데, 이 화살표 연산자는 포인터 연산을 하게 해주는 것입니다. 사용 형태는,

(구조체 포인터 변수)->멤버명

입니다.

이런 방식으로 구조체 변수의 멤버에 접근할 수 있게 됩니다. 이것과 같은 것이 바로 구조체 포인터 변수를 역참조해 구조체 변수를 얻은 후, <<.>>을 이용해 해당 구조체의 멤버에 접근하는 것입니다.

(*구조체 포인터 변수).멤버명


이상으로 C언어에서 구조체 변수의 값을 바꾸는 방법을 알아보았습니다. 감사합니다.

댓글