• 검색 결과가 없습니다.

15강. 포인터로 구조체 다루기

N/A
N/A
Protected

Academic year: 2022

Share "15강. 포인터로 구조체 다루기"

Copied!
10
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

C 언어 포인터 정복하기

TAE-HYONG KIM

COMPUTER ENG, KIT

15강. 포인터로 구조체 다루기

(2)

학습 내용

 구조체 배열로 자료 저장하기

 구조체 포인터로 자료 접근하기

 함수의 인자로 구조체 넘겨주기

 함수로부터 구조체 넘겨받기

2

(3)

구조체와 자료 생성

 구조체는 어떤 자료를 생성하기 위한 정보를 구성해 준다

 책: 제목, 저자, 출판사, 출판일, 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)

구조체 배열의 구성

 구조체 배열의 메모리 구성

 구조체 배열의 정보 입력

 각 배열요소를 구조체변수처럼 사용

 배열처럼 초기화 가능

 멤버가 많으므로 보통 함수로 설계

 구조체 배열(이름)을 저장하려면?

 구조체 포인터 필요

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)

구조체 포인터의 선언과 용법

 구조체 포인터의 생성 및 선언

 구조체 변수 앞에 ‘&’를 붙여 구조체 포인터 상수 생성

 구조체 포인터를 저장할 구조체 포인터 변수 선언

• 구조체자료형 *포인터변수;

 구조체 포인터로 멤버 접근하기

 구조체포인터 참조연산을 통해 접근 ( 우선순위 주의)

 간접멤버참조연산자 (->)를 통해 접근

• 구조체포인터

->구조체멤버

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;

(6)

구조체를 함수에 전달하기

 변수와 동일한 함수 인자 전달방식을 갖는다

 구조체 변수 값 전달(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)

구조체 포인터 함수 전달 예

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)

구조체 포인터 함수 전달 예

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)

함수로부터 구조체 전달받기

 함수로부터 구조체를 전달받는 방법

 구조체포인터로 전달한 인자로부터 자동 갱신

 함수의 반환값으로부터 전달받아 저장하기

• 구조체 반환 함수

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;

}

(10)

다음 강의 소개

 16강. 포인터로 자료 구조화 하기

 구조체멤버와 구조체포인터 멤버

 다른 구조체(변수)를 가리키는 구조체(변수)

 ‘연결된 리스트’의 구성 및 관리

 포인터로 ‘연결된 리스트’ 탐색하기

10

참조

관련 문서

본 연구에서는 지하 복공식 CAES 시설의 기밀시스템을 구성하는 콘크리트 라이닝 구조체 및 주변 암반의 기밀특성 파악을 목적으로 CAES

본 연구에서는 3D 프린팅 기 술을 통한 디지털 제어방식으로부터 계층적 나노기 공구조를 가지는 금 구조체 (3D printing hierarchical nanoporous Au; 3DP-hnp-Au)를

이렇게 다양한 연구 분야에 새로운 시각으로 접근하고 있으며, 단 순히 유기 구조체 설계 및 합성에 그치지 않고 여러 가지 응용 분야에 적용한 후,

The above mentioned IMIA members, including Member Societies, Institutional Members, Affiliate Members, and Hononary Fellows, collaborate to achieve the IMIA’s objec- tives

이러한 연구는 사용자의 물리 적, 경험적 지식을 기반으로 원하는 광특성을 나타낼 수 있는 기본적 나노 광학 구조체를 설 정하고 그 구조체 안에서 적절한 매개

However, it wasn’t very popular, so he tried again in 1859, renaming the song “Jingle Bells.” This time 이 름 을 바 꿨 다 Pierpont found success, and the song became

People may change their dietary habits voluntarily, but they may also change them because of the (A)demands associated with economic development, which can pressure non-Western

단어TEST Update 2018..