C 언어 포인터 정복하기
TAE-HYONG KIM
COMPUTER ENG, KIT
15강. 포인터로 구조체 다루기
학습 내용
구조체 배열로 자료 저장하기
구조체 포인터로 자료 접근하기
함수의 인자로 구조체 넘겨주기
함수로부터 구조체 넘겨받기
2
구조체와 자료 생성
구조체는 어떤 자료를 생성하기 위한 정보를 구성해 준다
책: 제목, 저자, 출판사, 출판일, ISBN, 가격
구조체 변수는 책 1권의 정보를 저장할 수 있다
소유한 책들의 정보를 저장하여 관리하려면 배열로 선언해야 한다
구조체 배열3
struct book {
char title[30];
char author[20];
char publisher[20];
char date[11];
char ISBN[14];
int price;
};
typedef struct book BOOK;
BOOK book1 = { “에티카”, “스피노자”, “책세상”, “2006.10.25”,
“9788970135953”, 5900 };
BOOK mybooks[100];
mybooks[0] = book1;
strcpy(mybooks[1].title, “이방인”);
구조체 배열의 구성
구조체 배열의 메모리 구성
구조체 배열의 정보 입력
각 배열요소를 구조체변수처럼 사용
배열처럼 초기화 가능
멤버가 많으므로 보통 함수로 설계
구조체 배열(이름)을 저장하려면?
구조체 포인터 필요
4
struct person { char name[8];
unsigned age;
} members[3];
printf(“%u”, sizeof(members));
100 104 108 112
128 132 116 120 124 members[0]
.name .age members[1]
.name .age members[2]
.name .age
struct person members
strcpy(members[0].name, “홍길동”);
members[0].age = 20;
memCnt = addMember(members, memCnt);
구조체 포인터의 선언과 용법
구조체 포인터의 생성 및 선언
구조체 변수 앞에 ‘&’를 붙여 구조체 포인터 상수 생성
구조체 포인터를 저장할 구조체 포인터 변수 선언
• 구조체자료형 *포인터변수;
구조체 포인터로 멤버 접근하기
구조체포인터 참조연산을 통해 접근 ( 우선순위 주의)
간접멤버참조연산자 (->)를 통해 접근
• 구조체포인터
->구조체멤버5
struct person member;
? = &member; 100
104 108 112 116 .name
.age member
struct person
&member
struct person *memptr = &member;
struct person
memptr 100
(*memptr).age = 20;
memptr->age = 30;
구조체를 함수에 전달하기
변수와 동일한 함수 인자 전달방식을 갖는다
구조체 변수 값 전달(Call by Value)
• 구조체 변수 값을 복사해 사용 원래 구조체 값은 바뀌지 않음
구조체 포인터 전달(Call by Reference)
• 구조체포인터 값이 복사됨 원 구조체에 직접 접근
• 구조체배열의 이름을 전달할 때 배열 공간에 직접 접근
6
printPerson(member); // void printPerson(struct person);
printPerson(members[0]);
modifyPerson(&member); // void modifyPerson(struct person *);
memCnt = addPerson(members, memCnt);
// int modifyPerson(struct person *, int);
// int modifyPerson(struct person [], int);
구조체 포인터 함수 전달 예
7
패턴 22 함수를 통한 회원(구조체) 입력 및 출력 (1)
#include <stdio.h>
#define N 10 typedef struct { char name[8];
int age;
} PERSON;
int addPerson(PERSON *, int); // 회원입력함수 Void printPerson(PERSON); // 회원출력함수 Int main(void)
{
PERSON members[N]; // 회원 구조체 배열 int memCnt = 0; // 현재 회원 수 저장 int sel, I;
while (1) {
printf("선택하세요 (1: 회원입력 2: 회원출력 3: 종료) : ");
scanf("%d", &sel);
fflush(stdin);
if (sel == 1)
memCnt = addPerson(members, memCnt); // memCnt번째 요소에 입력
구조체 포인터 함수 전달 예
8
패턴 22 함수를 통한 회원(구조체) 입력 및 출력 (2)
else if (sel == 2)
for (i=0; i<memCnt; i++)
printPerson(members[i]); // i번째 회원출력 else
break; // 종료 }
return 0;
}
int addPerson(PERSON *memPtr, int num) // 배열 전체 전달받음 {
printf("회원의 이름을 입력하세요: ");
fgets(memPtr[num].name, 8, stdin);
printf("회원의 나이를 입력하세요: ");
scanf("%d", &(memPtr+num)->age); // scanf(“%d”, &memPtr[num].age);
fflush(stdin);
return num+1;
}
Void printPerson(PERSON member) // 한 회원의 값만 전달받음 {
printf("회원 이름: %s", member.name);
printf("회원 나이 : %d\n\n", member.age);
}
함수로부터 구조체 전달받기
함수로부터 구조체를 전달받는 방법
구조체포인터로 전달한 인자로부터 자동 갱신
함수의 반환값으로부터 전달받아 저장하기
• 구조체 반환 함수
9
struct person member, members[3];
int memCnt = 1;
...
member = getPerson(members, memCnt);
printPerson(member);
...
struct person getPerson(struct person *memPtr, int num) {
struct person outMem;
strcpy(outMem.name, memPtr[num].name);
outMem.age = memPtr[num].age;
return outMem;
}