C-Language/Structures

Structures in C Language

Soul-Learner 2016. 11. 13. 14:51

C 언어 구조체 사용하기



C 언어의 구조체는 하나의 레코드(Record)를 표현하기 위해 사용된다. 한개의 레코드는 다수개의 속성으로 구성되므로 C 언어에서 구조체를 정의할 때는 다수개의 변수가 포함된다.


구조체 선언 형식

struct [ struct tag ]                       // 구조체 태그는 옵션

{

   한개 이상의 멤버변수;

} [ 한개 이상의 구조체 변수] ;


구조체 선언의 예

struct User

{

   int id;

   char name[20];

   char email[20];

} guest ;



#include <stdio.h>
#include <string.h>

struct User 
{
	int id;
	char name[20];
	char email[20];
};

int main()
{
	struct User guest;
	guest.id = 10;

	/* 문자배열에 문자열을 저장하기 위해 아래처럼 한다면 오류, 배열은 포인터 상수이기 때문*/
	//guest.name = "홍길동";
	//guest.email = "hong@daum.net";

	/* 배열의 주소는 변경할 수 없지만 원소는 변경할 수 있다 */
	strcpy(guest.name, "홍길동");
	strcpy(guest.email, "hone@daum.net");

	printf("번호:%d, 이름:%s, 메일:%s \n", guest.id, guest.name, guest.email);

	return 0;
}



구조체변수의 초기화

구조체의 전역변수(Global Variables)나 static 변수는 자동으로 그 멤버변수가 다음과 같은 값으로 초기화된다

정수 : 0

문자 : '\0'

포인터 : NULL


구조체 지역변수는 명시적으로 초기화해야 한다

#include <stdio.h>

#include <string.h> // memset()

#include <stdlib.h> // malloc()


struct MEMBER

{

int num;

char name[20];

char phone[20];

} m1,m2;


typedef struct _STUDENT

{

int num;

char name[20];

char phone[20];

} Student;


//구조체 초기화 방법

/*

void *memset(void *str, int c, size_t n)

The C library function void *memset(void *str, int c, size_t n) copies the character c(an unsigned char) to the first n characters of the string pointed to, by the argument str.

*/

int main()

{

printf("번호:%d, 이름:%s, 전화:%s \n", m1.num, m1.name, m1.phone);


struct MEMBER m3 = { 0 };

printf("번호:%d, 이름:%s, 전화:%s \n", m3.num, m3.name, m3.phone);


//{0}으로 초기화하는 방법은 동적으로 할당된 메모리에는 사용할 수 없다

struct MEMBER* m4 = ( struct MEMBER* ) malloc( sizeof ( struct MEMBER ) );

memset ( m4, 0, sizeof ( struct MEMBER ) );

printf("번호:%d, 이름:%s, 전화:%s \n", m4->num, m4->name, m4->phone);


Student st = { 0 };  //혹은 아래처럼 초기화할 수 있다

memset ( &st, 0, sizeof(st) );

printf("번호:%d, 이름:%s, 전화:%s \n", st.num, st.name, st.phone);


st.num = 11;

strcpy(st.name, "홍길동");

strcpy(st.phone, "010-9548-1793");

printf("번호:%d, 이름:%s, 전화:%s \n", st.num, st.name, st.phone);


return 0;

}



구조체를 함수의 파라미터에 전달하는 예 ( Call by value )

#include <stdio.h>
#include <string.h>

struct User
{
	int id;
	char name[20];
	char email[20];
};

void printUser(struct User user);  //구조체를 파라미터로 선언한 함수(Call by value)

int main()
{
	/* 첫번째 구조체 변수 선언 */
	struct User guest1;
	guest1.id = 10;

	/* 문자배열에 문자열을 저장하기 위해 아래처럼 한다면 오류, 배열은 포인터 상수이기 때문 */
	//guest.name = "홍길동";
	//guest.email = "hong@daum.net";

	/* 배열의 주소는 변경할 수 없지만 원소는 변경할 수 있다 */
	strcpy(guest1.name, "홍길동");
	strcpy(guest1.email, "hone@daum.net");

	printUser(guest1); // Call by value : 구조체의 내용이 복사되어 전달됨

	/* 2번째 구조체 변수 선언 */
	struct User guest2;

	guest2.id = 20;
	strcpy(guest2.name, "김인철");
	strcpy(guest2.email, "ickim@korea.com");

	printUser(guest2); // Call by value

	return 0;
}

void printUser(struct User user)
{
	printf("번호:%d, 이름:%s, 메일:%s \n", user.id, user.name, user.email);
}



구조체의 포인터를 파라미터로 전달하는 예

#include <stdio.h>
#include <string.h>

struct User
{
	int id;
	char name[20];
	char email[20];
};

void printUser(struct User *user);  // Call by reference

int main()
{
	// 구조체 변수 선언
	struct User guest1;

	// 구조체 변수 초기화
	guest1.id = 10;
	strcpy(guest1.name, "홍길동");
	strcpy(guest1.email, "hone@daum.net");

	// 구조체 주소 전달
	printUser(&guest1); // Call by reference : 구조체의 주소가 복사되어 전달됨

	return 0;
}

// 구조체 포인터를 파라미터로 선언한 함수
void printUser(struct User *user)
{
	printf("번호:%d, 이름:%s, 메일:%s \n", (*user).id, (*user).name, (*user).email);
	printf("번호:%d, 이름:%s, 메일:%s \n", user->id, user->name, user->email );
}