Structures in C Language
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 ); }