본문 바로가기
컴퓨터 언어/C\C++

[c 언어] 구조체의 정의 & 배열과 포인터 구조체 만들기.

by SuperMemi 2020. 4. 4.
반응형

구조체의 정의

 

'구조체(structure)'라는 것은 하나 이상의 변수(포인터 변수와 배열 포함)을 묶어서 새로운 자료형을 정의 하는 도구이다.

 

예를 들어 생각해 보자.

 

프로그램상에서 마우스의 좌표정보를 저장하고 관리해야 한다고 가정할 때,

 

int xpos;
int ypos;

 

위의 코드와 같이 마우스의 x좌표와 y좌표 두가지의 변수를 선언해야한다.

 

이 두개의 좌표는 각각 독립적인 것이 아니라, 마우스의 위치라는 하나의 정보를 표현한다.

 

만약 마우스의 위치정보를 출력하거나 갱신해야 한다면 동시에 적용되어야 한다는 것이다.

이를 용이하게 하기 위해 구조체라는 개념을 사용한다.

 


예제.

#include <stdio.h>

struct point   // point라는 이름의 구조체 만듦.
{
    int xpos;
    int ypos;
};


int main(void)
{
    struct point pos = { 20,30 };	// point라는 이름을 가진 구조체의 구조체 변수 pos 선언.
					// 선언과 동시에 초기화, xpos, ypos 순서로 값이 대입.
    printf("%d %d\n", pos.xpos, pos.ypos);
    pos.xpos = 10;	// xpos 접근
    pos.ypos = 20;  // ypos 접근
    printf("%d %d\n", pos.xpos, pos.ypos);
    return 0;
}

실행결과.


구조체 배열

 

구조체 배열은 변수의 형태가 배열이라는 점만 다르다.

 

아래와 같이 전화번호부를 저장하는 배열 구조체를 만들어 보자.


 

예제.

#include<stdio.h>

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

int main(void)
{
    struct person arr[3] ={
    	{"김힘찬", "010-7777-7765", 24},  // 첫번째 요소 초기화
        {"박도롱", "010-2121-2121", 24},  // 두번째 요소 초기화
        {"유도동", "010-5454-5454", 24}   // 세번째 요소 초기화
    };
    
    int i;
    for(i=0; i<3; i++){
    	printf("%s %s %d \n", arr[i].name, arr[i].phoneNum, arr[i].age);
    }
    return 0;
}

실행결과.

 


구조체 변수와 포인터

 

구조체 포인터 변수의 선언 및 연산의 방법도 일반적인 포인터 변수의 선언 및 연산 방법과 다르지 않다.


예제1. 구조체 포인터 변수.

 

#include <stdio.h>

struct point		// 구조체 point의 정의
{
	int xpos;
	int ypos;
};

int main(void)
{
	struct point pos1 = { 1,2 };
	struct point pos2 = { 100,200 };
	struct point* pptr = &pos1;  // 구조체 포인터 변수 pptr을 선언함과 동시에 &pos1의 주소로 초기화 시켰다.

	(*pptr).xpos += 6;
	(*pptr).ypos += 9;
	printf("[%d, %d] \n", pos1.xpos, pos1.ypos);
	printf("[%d, %d] \n", pptr->xpos, pptr->ypos);  // pptr->xpos 는 (*pptr).xpos와 동일하다.
	printf("[%d, %d] \n", (*pptr).xpos, (*pptr).ypos);

	pptr = &pos2;
	pptr->xpos += 13;
	pptr->ypos += 16;
	printf("[%d, %d] \n", pptr->xpos, pptr->ypos);

	return 0;
}

 

실행결과.

 


예제2. 포인터 변수를 구조체 맴버로 받아 들일 수도 있다.

 

 

위 도식과 같은 예제 코드를 만들어보자.

포인터 변수 center은 cen의 첫번째 주소를 가리킨다.

 

#include <stdio.h>

struct point		// 구조체 point의 정의
{
	int xpos;
	int ypos;
};

struct circle
{
	double radius;
	struct point* center;  // 포인터 변수도 구조체의 멤버가 될 수 있다.
};

int main(void)
{
	struct point cen = { 3,6 };
	double rad = 5.5;	// 반지름
	
	struct circle ring = { rad, &cen }; // 구조체 변수 ring의 멤버 center가 구조체 변수 cen을 가리키는 형태가 되었다.
	printf("원의 반지름: %g \n", ring.radius);
	printf("원의 중심 [%d, %d] \n", (ring.center)->xpos, (ring.center)->ypos);
	return 0;
}

 

실행결과.

 


참고.

책<열혈 C 프로그래밍>/ 윤성우 저/OrangeMedia 출판.

반응형