제 2 장 배열과 스트링

47
2 2 제제제 제제제 제제제 제제제

Upload: lenore-massey

Post on 02-Jan-2016

43 views

Category:

Documents


5 download

DESCRIPTION

제 2 장 배열과 스트링. 주소. 배열 원소. 1 2 3 4 5 6 7 8 9. A(0,0) A(0,1) A(0,2) A(1,0) A(1,1) A(1,2) A(2,0) A(2,1) A(2,2). A(0,0)A(0,1)A(0,2) A(1,0)A(1,1)A(1,2) A(2,0)A(2,1)A(2,2). 배열 표현. 배열의 주소할당. 1 차원 배열 (1). 배열의 정의 동일한 데이타형을 갖는 원소들이 2 차원 장방형 구조에 놓여 있는 집합체 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 제  2  장  배열과 스트링

제 제 2 2 장 장

배열과 스트링배열과 스트링

Page 2: 제  2  장  배열과 스트링

자료구조론 2

A(0,0)A(0,0) A(0,1)A(0,1) A(0,2)A(0,2)

A(1,0)A(1,0) A(1,1)A(1,1) A(1,2)A(1,2)

A(2,0)A(2,0) A(2,1)A(2,1) A(2,2)A(2,2)

주소주소

112233445566778899

배열 원소배열 원소

A(0,0)A(0,0)A(0,1)A(0,1)A(0,2)A(0,2)A(1,0)A(1,0)A(1,1)A(1,1)A(1,2)A(1,2)A(2,0)A(2,0)A(2,1)A(2,1)A(2,2)A(2,2)

배열 표현배열 표현 배열의 주소할당배열의 주소할당

11 차원 배열 차원 배열 (1) (1)

배열의 정의 동일한 데이타형을 갖는 원소들이 2 차원 장방형 구조에 놓여 있는

집합체 인덱스와 값의 쌍으로 구성된 집합이며 반드시 유한성을 갖음

배열 표현과 주소 할당

Page 3: 제  2  장  배열과 스트링

자료구조론 3

11 차원 배열 차원 배열 (2) (2)

배열의 공리

structurestructure ARRAY(value, index) ARRAY(value, index)

①① declaredeclare CREATE() --> array CREATE() --> array

②② RETRIEVE(array, index) --> value;RETRIEVE(array, index) --> value;

STORE(array, index, value) --> array;STORE(array, index, value) --> array;

③③ forfor all A all A array, i, j array, i, j index, x index, x value value letlet

④④ RETRIEVE(CREATE, i) ::= error;RETRIEVE(CREATE, i) ::= error;

⑤⑤ RETRIEVE(STORE(A, i, x), j) ::=RETRIEVE(STORE(A, i, x), j) ::=

ifif EQUAL(i, j) EQUAL(i, j) thenthen x x elseelse RETRIEVE(A, j); RETRIEVE(A, j);

endend

endend ARRAY ARRAY

Page 4: 제  2  장  배열과 스트링

자료구조론 4

11 차원 배열 차원 배열 (3)(3)

크기가 n 인 1 차원 배열의 표현

배열의 주소값 구하기 A(i) = B + k * ( i - L )

B : 주어진 배열의 시작 주소 k : 각 원소가 차지하는 기억 장소 단위 L : 인덱스 변수의 하한값 ( 배열의 첨자가 0 으로 시작하면 0 이고 ,

배열의 첨자가 1 로부터 시작하면 1 이다 )

예 ) 배열 A(0:99) 에서 첫번째 원소주소가 200 번지이고

원소길이가 10 바이트인 1 차원 배열에서 50 번째 원소의 주소

A(49) 의 주소 = 200 +10(49-0) = 690

A(0) A(1) • • • A(n-1)

11 차원 배열 차원 배열 AA

Page 5: 제  2  장  배열과 스트링

자료구조론 5

2 차원 배열 A(p:m, q:n) A(p:m, q:n) = { A(i, j) | i = p, ..., m 과 j = q, ..., n }

배열 A 의 행의 개수 = m-p+1, 열 A 의 열의 개수 = n-q+1 배열 A 의 총 원소의 개수 = (m–p+1) (n–q+1)

다차원 배열 다차원 배열 (1)(1)

qq q+1q+1 nn

pp

p+1p+1

mm

22 차원 배열 차원 배열 A(p:m, q:n)A(p:m, q:n)

Page 6: 제  2  장  배열과 스트링

자료구조론 6

3 차원 배열 B(r:z, p:m, q:n) B(r:z, p:m, q:n) = { B(i, j, k) | i= r, ...,z 과 j=

p, ...,m 과 k= q, ...,n }

다차원 배열 다차원 배열 (2)(2)

p

m

q nr

z•••

• • •

••

3차원 배열의 원소의 개수(z-r+1) (m-p+1) (n-ⅹ ⅹ

q+1)

Page 7: 제  2  장  배열과 스트링

자료구조론 7

다차원 배열 다차원 배열 (3)(3)

n 차원 배열 C(L1:U1, L2:U2, …, Ln:Un)

C(L1:U1, L2:U2, …, Ln:Un) = { C(i1, i2, …, in) | k=1, 2, …, n, Lk< ik< Uk }

배열 C 의 총 원소의 개수 = (U1 - L1 + 1) (U2 - L2 + 1) … (Un - Ln + 1)

Page 8: 제  2  장  배열과 스트링

자료구조론 8

다차원 배열 다차원 배열 (4)(4)

배열의 물리적 표현 기억장치에는

순차적으로 저장됨으로 인하여 2 종류로 표현가능

배열 A(0:1, 0:2, 0:1) 의 나열 순서

A(1, 2, 1)A(1, 2, 1)112

A(1, 2, 0)A(1, 1, 1)111

A(1, 1, 1)A(1, 0, 1)110

A(1, 1, 0)A(1, 2, 0)109

A(1, 0, 1)A(1, 1, 0)108

A(1, 0, 0)A(1, 0, 0)107

A(0, 2, 1)A(0, 2, 1)106

A(0, 2, 0)A(0, 1, 1)105

A(0, 1, 1)A(0, 0, 1)104

A(0, 1, 0)A(0, 2, 0)103

A(0, 0, 1)A(0, 1, 0)102

A(0, 0, 0)A(0, 0, 0)101

행 방향 순서열 방향 순서번지

Page 9: 제  2  장  배열과 스트링

자료구조론 9

다차원 배열 다차원 배열 (5)(5)

배열의 물리적 표현 ( 계속 ) 열 방향 순서 (column major order)

FORTRAN

2 차원 배열 A(0:U1-1, 0:U2-1)A(i, j)A(i, j) 의 주소 의 주소 = B + jU= B + jU11 + i + i

3 차원 배열 A(0:U1-1, 0:U2-1, 0:U3-1)

A(i, j, k)A(i, j, k) 의 주소 의 주소 = B + iU= B + iU22UU33 + kU + kU22 + j + j

행 방향 순서 (row major order) C, PASCAL, PL/1, COBOL

2 차원 배열 A(0:U1-1, 0:U2-1) A(i, j)A(i, j) 의 주소 의 주소 = B + iU= B + iU22 + j + j

3 차원 배열 A(0:U1-1, 0:U2-1, 0:U3-1)

A(i, j, k)A(i, j, k) 의 주소 의 주소 = B + iU= B + iU22UU33 + jU + jU33 + k + k

Page 10: 제  2  장  배열과 스트링

자료구조론 10

특수 행렬 특수 행렬 (1)(1)

희소 행렬 (sparse matrix) 행렬의 많은 원소들이 0 으로 구성되어 있는 행렬

000700행 5

000009행 4

003000행 3

0110-600행 2

0002800행 1

5000020행 0

열 5열 4열 3열 2열 1열 0

-8

0

0

0

0

-1

열 6

0000-30행 6 0

Page 11: 제  2  장  배열과 스트링

자료구조론 11

특수 행렬 특수 행렬 (2)(2)

희소 행렬 (sparse matrix) 의 표현 기억 장소의 낭비를 줄이기 위한 표현 방법 0 인 아닌 원소들에 대하여 ( 행 , 열 , 값 ) 의 형태로

표현

-86510

7259

9048

3337

11426

-6225

28214

-1603

55022000111770

210행 / 열

-31611

Page 12: 제  2  장  배열과 스트링

자료구조론 12

특수 행렬 특수 행렬 (3)(3)

전치 행렬 (transpose matrix) 행렬에서 (i, j) 에 위치한 원소를 (j, i) 로 옮기는 행렬

-10610

5059

11248

3337

7526

-6225

28124

-3613

9402

20001

11770

210행 / 열

-85611

000005행 5

0001100행 4

003000행 3

700-6280행 2

000000행 1

0900020행 0

열 5열 4열 3열 2열 1열 0행 / 열

0

0

0

0

-3

0

열 6

-80000-1행 6 0

Page 13: 제  2  장  배열과 스트링

자료구조론 13

특수 행렬 특수 행렬 (4)(4)

삼각 행렬 (triangular matrix) 행과 열의 수가 같은 정방 행렬로서 , 대각선을 중심으로 한쪽

부분이 0 인 행렬

상삼각 행렬상삼각 행렬

XX0000000000

XXXX00000000

XXXXXX000000

XXXXXXXX0000

XXXXXXXXXX00

XXXXXXXXXXXX

하삼각 행렬하삼각 행렬

XXXXXXXXXXXX

00XXXXXXXXXX

0000XXXXXXXX

000000XXXXXX

00000000XXXX

0000000000XX

Page 14: 제  2  장  배열과 스트링

자료구조론 14

특별한 행렬 특별한 행렬 (5/5)(5/5)

하삼각 행렬의 표현

A(0,0)A(0,0)A(1,0)A(1,0) A(1,1)A(1,1)A(2,0)A(2,0) A(2,1)A(2,1) A(2,2)A(2,2)A(3,0)A(3,0) A(3,1)A(3,1) A(3,2)A(3,2) A(3,3)A(3,3)

하삼각 행렬하삼각 행렬

주소주소112233445566778899

1010

배열 원소배열 원소A(0,0)A(0,0)A(1,0)A(1,0)A(1,1)A(1,1)A(2,0)A(2,0)A(2,1)A(2,1)A(2,2)A(2,2)A(3,0)A(3,0)A(3,1)A(3,1)A(3,2)A(3,2)A(3,3)A(3,3)

주소 할당주소 할당

Page 15: 제  2  장  배열과 스트링

자료구조론 15

C C 언어에서의 배열언어에서의 배열 1 차원 배열의 선언

2 차원 배열의 선언

C 언어에서 2 차원 배열의 기억 장소 배열 순서는 행우선 법칙을 사용

데이타형태데이타형태 [] [] 배열명 배열명 = = 데이타형태데이타형태 [[ 원소수원소수 ];];

데이타형태데이타형태 [][] [][] 배열명 배열명 = = 데이타형태데이타형태 [[ 원소수원소수 ][][ 원소수원소수 ];];

Page 16: 제  2  장  배열과 스트링

자료구조론 16

C C 언어에서의 언어에서의 11 차원 배열차원 배열

int A[6];

A[0] A[1] A[2] A[3] A[4] A[5]

basebase+sizeof(int)

base+2*sizeof(int)base+3*sizeof(int)

base+4*sizeof(int)base+5*sizeof(int)

Page 17: 제  2  장  배열과 스트링

자료구조론 17

C C 언어에서의 언어에서의 22 차원 배열차원 배열

int A[3][4];

A[2][0] A[2][1] A[2][2]

A[1][0] A[1][1] A[1][2]

A[0][0] A[0][1] A[0][2]

A[2][3]

A[1][0]

A[0][3]

A[0][2]

A[0][1]

A[0][0]

A[2][3]

A[1][3]

A[0][3]

실제 메모리안에서의 위치

Page 18: 제  2  장  배열과 스트링

자료구조론 18

스트링의 표현 방법 스트링의 표현 방법 (1)(1)

정의 일련의 문자들의 집합 1 차원적인 문장의 배열 , 공백과 구두점 같은 특수

문자들을 포함한 모든 유효한 문자를 사용한 문자들의 모임

ex) “Silla University”, .. 등 대부분의 경우 문자 데이터형의 1 차원 배열로 표현

C 언어에서 스트링 정의 : char str[100]; 스트링의 끝임을 표시하기 위해 스트링 마지막 문자로 NULL

(‘\0’) 을 사용

Page 19: 제  2  장  배열과 스트링

자료구조론 19

스트링의 표현 방법 스트링의 표현 방법 (2)(2)

스트링의 표현방법 순차 스트링

스트링 S 에 대하여 , S 의 연속적인 문자들을 위하여 문자 코드들을 연속적인 워드에 나타내는 방법

1워드

처리속도 빠르지만 기억장소 활용도 낮음

비압축 스트링 비압축 스트링

• • • M• • • E• • • M• • • O• • • \0

Page 20: 제  2  장  배열과 스트링

자료구조론 20

스트링의 표현 방법 스트링의 표현 방법 (3)(3)

스트링의 표현방법 고정길이 스트링

압축 스트링

연결 리스트

1워드

PS

AT

CR

KI

EN

DG

XXX XXX XXX XXX •••

Page 21: 제  2  장  배열과 스트링

자료구조론 21

스트링의 표현 방법 스트링의 표현 방법 (4)(4)

스트링의 표현방법 가변길이 스트링

스트링의 길이를 예측하기 어려운 경우 사용하는 방법 ex) 어셈블러의 매크로 확장이나 스트링 결합과 같이 새로운

스트링을 다른 데이터의 함수로 계산하는 경우 , .. 등 . 프로그램 수행 도중 변화를 처리

Page 22: 제  2  장  배열과 스트링

자료구조론 22

스트링 연산 스트링 연산 (1)(1)

스트링 연산 결합 (concatenation)

두 스트링을 연쇄적으로 연결한 합성된 스트링이 결과로 나오는 연산

예 ) F = “KIM”, L = “LR” 일 때 F||L 이면 S=“KIMLR”

삽입 (insertion) 스트링을 구성하는 문자와 문자 사이에 새로운 스트링을

삽입하는 연산 예 ) S = “OPQRST” 일 때 “ PQ” S “P, Q” 이면

S = “OP, QRST”

Page 23: 제  2  장  배열과 스트링

자료구조론 23

스트링 연산 스트링 연산 (2)(2)

스트링 연산 삭제 (deletion)

스트링을 구성하는 문자들 중의 하나 이상의 문자를 제거하는 연산

예 ) S = “OPQRST” 일 때 “ P” S “ “ 이면 , S = “OQRST”

교체 (replacement) 스트링을 구성하는 문자들 중의 하나 이상의 문자를 바꾸는 연산 예 ) S = “$ 3.00” 일때 “ 3.00” S “3.50” 이면 S = “$3.50”

으로 바뀐다 .

Page 24: 제  2  장  배열과 스트링

자료구조론 24

스트링 연산 스트링 연산 (3)(3)

스트링 연산 서브스트링 (substring)

스트링을 구성하는 연속적인 문자들 중에서 일부를 찾아 새로운 스트링을 만드는 연산

패턴 매칭 (pattern matching) 스트링 중 지정된 서브스트링을 찾는 것으로 ,

지정된 서브 스트링이 있으면 참이고 , 없으면 거짓인 연산 예 ) S = “OPQRST” 일때 “ P” S 의 결과는 참

Page 25: 제  2  장  배열과 스트링

자료구조론 25

스트링 연산 스트링 연산 (4)(4)

스트링 연산 인덱싱 (indexing)

스트링 내에서 어떤 문자 또는 서브 스트링의 위치를 정수로 나타내는 연산

예 ) P = “LINKED LIST” 인 P 에서 “ LIS” 의 인덱싱 = 8

( 만약 , 해당 문자가 없으면 0 이며 , 복수 개이면 최초의

경우가 해당 )

Page 26: 제  2  장  배열과 스트링

자료구조론 26

C C 언어에서 스트링 연산언어에서 스트링 연산 (1)(1)

결합연산

스트링 s1 과 s2 를 결합한 결과를 반환

char *concate (char *s1, char *s2){char *s3;int len1, len2, len3, i;

len1=strlen(s1);len2=strlen(s2);len3=len1+len2;s3=malloc(len3+1);i=0;while(*s1){

s3[i++]=*s1;s1++;

}while(*s1){

s3[I++]=*s2;s2++;

}s3[I]=‘/0’;return(s3);

}

char *concate (char *s1, char *s2){char *s3;int len1, len2, len3, i;

len1=strlen(s1);len2=strlen(s2);len3=len1+len2;s3=malloc(len3+1);i=0;while(*s1){

s3[i++]=*s1;s1++;

}while(*s1){

s3[I++]=*s2;s2++;

}s3[I]=‘/0’;return(s3);

}

Page 27: 제  2  장  배열과 스트링

자료구조론 27

char *substr (char *s1, int i, int j){int k, limit;char *temp;

temp=malloc(j);If((i+j) <= strlen(s10) limit =i+j;else limit = strlen(s1);for(k=i; k<1; k++)

temp[k-i] = s1[i];for(k=limit-i; k<strlen(s1); k++)

temp[k}=‘ ‘;temp[strlen(s1)]=‘/0’;return(temp);

}

char *substr (char *s1, int i, int j){int k, limit;char *temp;

temp=malloc(j);If((i+j) <= strlen(s10) limit =i+j;else limit = strlen(s1);for(k=i; k<1; k++)

temp[k-i] = s1[i];for(k=limit-i; k<strlen(s1); k++)

temp[k}=‘ ‘;temp[strlen(s1)]=‘/0’;return(temp);

}

C C 언어에서 스트링 연산언어에서 스트링 연산 (2)(2)

서브스트링 연산

S1 의 i 위치에서부터 시작하여 j 개의 문자를 스트링 s2 로 만드는 함수

Page 28: 제  2  장  배열과 스트링

자료구조론 28

C C 언어에서 스트링 연산언어에서 스트링 연산 (3)(3)

C 라이브러리 함수 헤드 파일 : <string.h> 주요 함수 :

int strlen(const char *str); int strcmp(const char *str1, const char *str2); int strncmp(const char *str1, const char *str2, const int n); char* strcat(char *dest, const char *src); char* strncat(char *dest, const char *src, const int n); char* strcpy(char *dest, const char *src); char* strncpy(char *dest, const char *src, const int n);

Page 29: 제  2  장  배열과 스트링

자료구조론 29

C C 언어에서 스트링 연산언어에서 스트링 연산 (4)(4)

C 라이브러리 함수 주요 함수 :

char* strchr(const char *str, const char ch); char* strrchr(const char *str, const char ch); char* strstr(const char *str, const char *key); char* strpbrk(const char *str, const char *delimiter); char* strspn(const char *str, const char *delimiter); char* strcspn(const char *str, const char *delimiter); char* strtok(char *str, const char *delimiter);

Page 30: 제  2  장  배열과 스트링

자료구조론 30

구조체구조체 구조체 (structure): 타입이 다른 데이터를 하나로 묶는 방법 배열 (array): 타입이 같은 데이터들을 하나로 묶는 방법

배열

0 1

char carray[100];

구조체

필드

struct example {char cfield;int ifield;float ffield;double dfield;

};struct example s1;

Page 31: 제  2  장  배열과 스트링

자료구조론 31

구조체의 사용예구조체의 사용예 구조체의 선언과 구조체 변수의 생성

struct person {char name[10]; // 문자배열로 된 이름int age; // 나이를 나타내는 정수값float height; // 키를 나타내는 실수값

};struct person a; // 구조체 변수 선언

typedef 을 이용한 구조체의 선언과 구조체 변수의 생성typedef struct person {

char name[10]; // 문자배열로 된 이름int age; // 나이를 나타내는 정수값float height; // 키를 나타내는 실수값

} person;person a; // 구조체 변수 선언

Page 32: 제  2  장  배열과 스트링

자료구조론 32

구조체의 대입과 비교 연산구조체의 대입과 비교 연산 구조체 변수의 대입 : 가능

struct person {char name[10]; // 문자배열로 된 이름int age; // 나이를 나타내는 정수값float height; // 키를 나타내는 실수값

};main(){

person a, b;b = a; // 가능

}

구조체 변수끼리의 비교 : 불가능main(){

if( a > b )printf("a 가 b보다 나이가 많음 "); // 불가능

}

Page 33: 제  2  장  배열과 스트링

자료구조론 33

자체참조 구조체자체참조 구조체 자체 참조 구조체 (self-referential structure): 필드중에 자기

자신을 가리키는 포인터가 한 개 이상 존재하는 구조체 연결 리스트나 트리에 많이 등장

typedef struct ListNode { char data[10]; struct ListNode *link;

} ListNode;

Page 34: 제  2  장  배열과 스트링

자료구조론 34

포인터포인터 (pointer)(pointer)

포인터 : 다른 변수의 주소를 가지고 있는 변수 2

6

‘A’

변수 a

주소

26

포인터 p

char a='A';char *p;p = &a;

포인터가 가리키는 내용의 변경 : * 연산자 사용

*p= 'B'; 26

‘B’

변수 a

주소

26

포인터 p

Page 35: 제  2  장  배열과 스트링

자료구조론 35

포인터와 관련된 연산자포인터와 관련된 연산자 & 연산자 : 변수의 주소를

추출 * 연산자 : 포인터가

가리키는 곳의 내용을 추출

26

‘A’

변수 a

주소

26

포인터 p

&a*p

p // 포인터*p // 포인터가 가리키는 값*p++ // 포인터가 가리키는 값을 가져온 다음 , 포인터를 한칸 증가한다 .*p-- // 포인터가 가리키는 값을 가져온 다음 , 포인터를 한칸 감소한다 .(*p)++ // 포인터가 가리키는 값을 증가시킨다 .

int a; // 정수 변수 선언int *p; // 정수 포인터 선언int **pp; // 정수 포인터의 포인터 선언p = &a; // 변수 a 와 포인터 p 를 연결pp = &p; // 포인터 p 와 포인터의 포인터 pp 를 연결

Page 36: 제  2  장  배열과 스트링

자료구조론 36

디양한 포인터디양한 포인터

포인터의 종류

void *p; // p 는 아무것도 가리키지 않는 포인터int *pi; // pi 는 정수 변수를 가리키는 포인터float *pf; // pf 는 실수 변수를 가리키는 포인터char *pc; // pc 는 문자 변수를 가리키는 포인터int **pp; // pp 는 포인터를 가리키는 포인터struct test *ps; // ps 는 test 타입의 구조체를 가리키는 포인터void (*f)(int) ; // f 는 함수를 가리키는 포인터

포인터의 형변환 : 필요할 때마다 형변환하는 것이 가능하다 .

void *p;pi=(int *) p;

Page 37: 제  2  장  배열과 스트링

자료구조론 37

함수의 파라미터로서의 포인터함수의 파라미터로서의 포인터

함수안에서 파라미터로 전달된 포인터를 이용하여 외부 변수의 값 변경 가능

void swap(int *px, int *py){

int tmp;tmp = *px;*px = *py;*py = tmp;

}main(){

int a=1,b=2;printf("swap 을 호출하기 전 : a=%d, b=%d\n", a,b);swap(&a, &b);printf("swap 을 호출한 다음 : a=%d, b=%d\n", a,b);

}

Page 38: 제  2  장  배열과 스트링

자료구조론 38

배열과 포인터배열과 포인터 배열의 이름 : 사실상의 포인터와 같은 역할

10

A[0]

A

14

A[1]

18

A[2]

22

A[3]

26

A[4]

30

A[5]

컴파일러가 배열의 이름을 배열의 첫번째 주소로 대치

Page 39: 제  2  장  배열과 스트링

자료구조론 39

구조체의 포인터구조체의 포인터 구조체의 요소에 접근하는

연산자 : ->

3.14

98

98

2

ps

s

s.I = ps->i

s.f = ps->f

main(){

struct {int i;float f;

} s, *ps;ps = &s;ps->i = 2;ps->f = 3.14;

}

Page 40: 제  2  장  배열과 스트링

자료구조론 40

포인터의 포인터포인터의 포인터

56

26

‘A’

변수 a

26

포인터 p

89

56

포인터의포인터 pp

int a; // 정수 변수 변수 선언int *p; // 정수 포인터 선언int **pp; // 정수 포인터의 포인터 선언p = &a; // 변수 a 와 포인터 p 를 연결pp = &p; // 포인터 p 와 포인터의 포인터 pp 를 연결

Page 41: 제  2  장  배열과 스트링

자료구조론 41

포인터 연산포인터 연산 포인터에 대한 사칙연산 : 포인터가 가리키는 객체단위로 계산된다 .

10

A[0]

p

14

A[1]

18

A[2]

22

A[3]

26

A[4]

30

A[5]

p+1p-1

p // 포인터p+1 // 포인터 p 가 가리키는 객체의 바로 뒤 객체 p-1 // 포인터 p 가 가리키는 객체의 바로 앞 객체

Page 42: 제  2  장  배열과 스트링

자료구조론 42

포인터 사용시 주의할 점포인터 사용시 주의할 점 포인터가 아무것도 가리키고 있지 않을 때는 NULL 로 설정

int *pi=NULL; 초기화가 안된 상태에서 사용 금지

main() {

char *pc; // 포인터 pi 는 초기화가 안되어 있음*pc = 'E’; // 위험한 코드

}

포인터 타입간의 변환시에는 명시적인 타입 변환 사용int *pi;float *pf;pf = (float *)pi;

Page 43: 제  2  장  배열과 스트링

자료구조론 43

동적 메모리 할당 동적 메모리 할당 (1)(1)

프로그램이 메모리를 할당받는 방법 정적 메모리 할당 (Static Memory Allocation) 동적 메모리 할당 (Dynamic memory Allocation)

정적 메모리 할당 메모리의 크기는 프로그램이 시작하기 전에 결정 프로그램의 수행 도중에 그 크기가 변경될 수는 없다 . 만약 처음에 결정된 크기보다 더 큰 입력이 들어온다면 처리하지 못할 것이고 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비될 것이다 .

( 예 ) 변수나 배열의 선언int buffer[100];char name[] = “data structure";

Page 44: 제  2  장  배열과 스트링

자료구조론 44

동적 메모리 할당 동적 메모리 할당 (2)(2)

동적 메모리 할당 프로그램의 실행 도중에 메모리를

할당받는 것 필요한 만큼만 할당을 받고 또 필요한

때에 사용하고 반납 메모리를 매우 효율적으로 사용가능 단점 :

운영체제로 부터 메모리를 할당받는 것만큼의 실행 시간 지연

할당받은 메모리는 받드시 반환하여야 함

메모리 200바이트가

필요한데… .

운영체제

프로그램

Page 45: 제  2  장  배열과 스트링

자료구조론 45

동적 메모리 할당 동적 메모리 할당 (3)(3)

전형적인 동적 메모리 할당 코드

main() { int *pi; pi = (int *)malloc(sizeof(int)); // 동적 메모리 할당 ... … // 동적 메모리 사용 ... free(pi); // 동적 메모리 반납}

동적 메모리 할당 관련 라이브러리 함수 malloc(size) // 메모리 할당 free(ptr) // 메모리 할당 해제 sizeof(var) // 변수나 타입의 크기 반환(바이트 단위)

Page 46: 제  2  장  배열과 스트링

자료구조론 46

동적 메모리 할당 라이브러리동적 메모리 할당 라이브러리 malloc(int size)

size 바이트 만큼의 메모리 블록을 할당(char *)malloc(100) ; /* 100 바이트로 50 개의 정수를 저장 */(int *)malloc(sizeof(int)); /* 정수 1 개를 저장할 메모리 확보 */(struct Book *)malloc(sizeof(struct Book)) /* 하나의 구조체 생성 */

free(void ptr) ptr이 가리키는 할당된 메모리 블록을 해제

sizeof 키워드 변수나 타입의 크기 반환 (바이트 단위)

size_t i = sizeof( int ); // 4struct AlignDepends { char c; int i;};size_t size = sizeof(struct AlignDepends); // 8 int array[] = { 1, 2, 3, 4, 5 }; size_t sizearr = sizeof( array ) / sizeof( array[0] ); // 20/4=5

Page 47: 제  2  장  배열과 스트링

자료구조론 47

동적 메모리 할당 예제동적 메모리 할당 예제struct Example {

int number;char name[10];

};

void main(){

struct Example *p;

p=(struct Example *)malloc(2*sizeof(struct Example));if(p==NULL){ fprintf(stderr, "can't allocate memory\n") ; exit(1) ;} p->number=1;strcpy(p->name,"Park");(p+1)->number=2;strcpy((p+1)->name,"Kim");free(p);

}