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 );
}