제 5 장 배열과 포인터

42
5 5 제 제제제 제제제 제 제제제 제제제

Upload: oral

Post on 21-Mar-2016

111 views

Category:

Documents


1 download

DESCRIPTION

제 5 장 배열과 포인터. 포인터와 주소. 포인터 기억 장소의 위치 ( 주소 ) 를 저장하는 변수 포인터 변수의 선언 type * pointer-variable ; & 연산자 피연산자의 주소를 의미 반드시 기억 장소에 존재하는 객체를 피연산자로 가져야 함 상수 , 수식 , 레지스터 변수를 피연산자로 가질 수 없음. 포인터의 개념. p = &v;. 참조 연산자. * 연산자 포인터가 가리키는 대상을 접근하는데 사용 예 )int x = 1, y = 2, z[10]; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 제  5 장 배열과 포인터

제 제 55 장 배열과 포인터장 배열과 포인터

Page 2: 제  5 장 배열과 포인터

포인터와 주소포인터와 주소 포인터포인터

– 기억 장소의 위치기억 장소의 위치 (( 주소주소 )) 를 저장하는 변수를 저장하는 변수– 포인터 변수의 선언포인터 변수의 선언

typetype * *pointer-variablepointer-variable;;

& & 연산자연산자– 피연산자의 주소를 의미피연산자의 주소를 의미– 반드시 기억 장소에 존재하는 객체를 피연산자로 반드시 기억 장소에 존재하는 객체를 피연산자로 가져야 함가져야 함– 상수상수 , , 수식수식 , , 레지스터 변수를 피연산자로 가질 수 없음레지스터 변수를 피연산자로 가질 수 없음

Page 3: 제  5 장 배열과 포인터

포인터의 개념포인터의 개념 p = &v;p = &v;

Page 4: 제  5 장 배열과 포인터

참조 연산자참조 연산자 * * 연산자연산자

– 포인터가 가리키는 대상을 접근하는데 사용포인터가 가리키는 대상을 접근하는데 사용– 예예 )) int x = 1, y = 2, z[10];int x = 1, y = 2, z[10];

int *ip;int *ip; /* ip is a pointer to int *//* ip is a pointer to int */ip = &x;ip = &x; /* now ip points to x *//* now ip points to x */y = *ip;y = *ip; /* y is now 1 *//* y is now 1 */

*ip = 0;*ip = 0; /* x is now 0 *//* x is now 0 */ip = &z[0];ip = &z[0]; /* now ip points to z[0] *//* now ip points to z[0] */

Page 5: 제  5 장 배열과 포인터

포인터 변수의 연산포인터 변수의 연산 voidvoid 형의 포인터를 제외한 모든 포인터는 가리키는 대상의 형의 포인터를 제외한 모든 포인터는 가리키는 대상의

데이타형이 있음데이타형이 있음– 예예 ) ) 정수형 포인터 정수형 포인터 ipip 가 있을 때 가 있을 때 *ip*ip 는 정수형 변수가 사용될 수 있는 모든 는 정수형 변수가 사용될 수 있는 모든

수식에 사용가능수식에 사용가능*ip += 1;*ip += 1;++*ip;++*ip;

voidvoid 형 포인터형 포인터 : generic pointer: generic pointer (*ip)++ (*ip)++ 과 과 *ip++*ip++ 의 차이의 차이 포인터는 그 자체가 변수이므로 다른 포인터 변수의 값을 지정하는 포인터는 그 자체가 변수이므로 다른 포인터 변수의 값을 지정하는

지정문에도 사용됨 지정문에도 사용됨– 예예 )) int i, *ip, *iq;int i, *ip, *iq;ip = &i;ip = &i;iq = ip;iq = ip;

Page 6: 제  5 장 배열과 포인터

포인터를 이용한 인자 전달포인터를 이용한 인자 전달 호 출 함 수 에 서 피 호 출 함 수 이 변 경 한 변 수 의 결 과 를 호 출 함 수 에 서 피 호 출 함 수 이 변 경 한 변 수 의 결 과 를

사용하려면 사용하려면 값을 변경시키려는 인자를 포인터로 전달하여야 값을 변경시키려는 인자를 포인터로 전달하여야 함함

swap swap 함수 함수 void swap(int *a, int *b)void swap(int *a, int *b){{int temp;int temp;

temp = *a;temp = *a;*a = *b;*a = *b;*b = temp;*b = temp;

}}

Page 7: 제  5 장 배열과 포인터

swap(&i, &j)swap(&i, &j) 의 동작의 동작

Page 8: 제  5 장 배열과 포인터

포인터와 배열포인터와 배열 포인터포인터

– int *pa;int *pa;– pa = &a[0];pa = &a[0];– papa 는 는 aa 의 첫번째 원소를 가리킨다의 첫번째 원소를 가리킨다

pa pa

a : a : – pa+ipa+i 는 는 papa 에서 에서 i i 만큼 뒤에 있는 원소를 가리킨다만큼 뒤에 있는 원소를 가리킨다 ..– papa 가 가 a[0]a[0] 을 가리키고 있다면 을 가리키고 있다면 *(pa+i)*(pa+i) 는 는 a[i]a[i] 를 참조를 참조

Page 9: 제  5 장 배열과 포인터

포인터와 배열포인터와 배열 (con’d)(con’d) 배열의 이름과 포인터의 유사점배열의 이름과 포인터의 유사점

– 배열의 이름은 배열의 첫번째 원소의 주소와 같다배열의 이름은 배열의 첫번째 원소의 주소와 같다– pa = &a[0]; pa = &a[0]; 은 은 pa = a; pa = a; 과 동일과 동일– 배열 배열 aa 의 원소 의 원소 a[i]a[i] 를 를 *(a+i)*(a+i) 로 나타내는 것도 가능로 나타내는 것도 가능– &a[i]&a[i] 와 와 a+ia+i 는 동일한 의미를 가짐는 동일한 의미를 가짐– pa[i]pa[i] 는 는 *(pa+i)*(pa+i) 와 같은 의미를 나타냄와 같은 의미를 나타냄

배열의 이름과 포인터의 차이점배열의 이름과 포인터의 차이점– 포인터는 변수이고 배열의 이름은 변수가 아니다포인터는 변수이고 배열의 이름은 변수가 아니다– 포인터의 경우는 다음과 같은 연산이 가능포인터의 경우는 다음과 같은 연산이 가능

pa = a;pa = a;pa++;pa++;– 배열의 이름은 다음과 같은 연산이 허용되지 않음 배열의 이름은 다음과 같은 연산이 허용되지 않음

a = pa;a = pa;a++;a++;

Page 10: 제  5 장 배열과 포인터

배열의 함수 이름 전달배열의 함수 이름 전달 배열의 이름을 함수의 인자로 전달배열의 이름을 함수의 인자로 전달

– 배열의 처음 원소의 주소가 전달이 된다배열의 처음 원소의 주소가 전달이 된다– 피호출 함수에서 배열 이름을 나타내는 인자는 피호출 함수에서 배열 이름을 나타내는 인자는

포인터이다포인터이다int strlen(char *s)int strlen(char *s){{int n;int n;

for (n = 0; *s != ''; s++)for (n = 0; *s != ''; s++)n++;n++;return n;return n;}}

– 함수를 정의할 때 형식 인자 함수를 정의할 때 형식 인자 char s[]char s[] 와 와 char *schar *s 는 동등는 동등– 그러나 그러나 char *schar *s 라고 선언하는 것이 더 좋음라고 선언하는 것이 더 좋음

Page 11: 제  5 장 배열과 포인터

주소 계산주소 계산 pp 가 포인터라면 가 포인터라면 p++p++ 는 기억 장소에서 바로 다음 원소를 는 기억 장소에서 바로 다음 원소를

가리키도록 가리키도록 pp 를 증가를 증가– typetype *p; *p; 일때 일때 p++p++ 은 포인터는 은 포인터는 11 만큼 증가하지만 실제로 기억 만큼 증가하지만 실제로 기억

장소의 주소는 장소의 주소는 sizeof(sizeof(typetype)) 만큼 증가됨만큼 증가됨 포인터와 정수는 연산에서 호환되지 않음포인터와 정수는 연산에서 호환되지 않음

– 00 은 예외적으로 지정 또는 비교에 사용은 예외적으로 지정 또는 비교에 사용– <stdio.h><stdio.h> 의 심볼 상수 의 심볼 상수 NULLNULL 은 포인터와 관련하여 은 포인터와 관련하여 0 0 대신에 사용대신에 사용

int *p;int *p;p = NULL;p = NULL; /* make p point to nothing *//* make p point to nothing */if (p == NULL) .....if (p == NULL) ..... /* test if p is NULL pointer *//* test if p is NULL pointer */– 포인터 포인터 pp 에 에 NULLNULL 을 지정하면 포인터는 기억 장소의 어뗜 위치도 을 지정하면 포인터는 기억 장소의 어뗜 위치도

가리키고 가리키고 있지 않다는 것을 의미있지 않다는 것을 의미

Page 12: 제  5 장 배열과 포인터

주소 계산주소 계산 (con’d)(con’d) 포인터에 대해 허용되는 연산포인터에 대해 허용되는 연산

– 같은 형의 포인터에 의한 지정같은 형의 포인터에 의한 지정– 포인터의 증감포인터의 증감– 포인터끼리의 비교 연산포인터끼리의 비교 연산– 포인터끼리의 뺄셈포인터끼리의 뺄셈

int strlen(char *s)int strlen(char *s){{char *p = s;char *p = s;

while (*p != '') p++;while (*p != '') p++;return p-s;return p-s;}}

Page 13: 제  5 장 배열과 포인터

charchar 형 포인터형 포인터 문자열 상수문자열 상수

– 문자 배열문자 배열– 함수의 인자로 사용되는 경우함수의 인자로 사용되는 경우 : : 문자열의 시작 문자열의 시작

주소가 인자로 전달주소가 인자로 전달

printf("hello, world");printf("hello, world");– charchar 형 포인터의 초기화에 사용형 포인터의 초기화에 사용

char *pmessage;char *pmessage;pmessage = "now is the time";pmessage = "now is the time"; /* /* 문자열 문자열

복사와 다름 복사와 다름 */*/

Page 14: 제  5 장 배열과 포인터

charchar 형 포인터형 포인터 (con’d)(con’d) 배열의 초기화와 포인터의 초기화배열의 초기화와 포인터의 초기화

char amessage[] = "now is the time";char amessage[] = "now is the time"; /* /* 배열 배열 */*/char *pmessage = "now is the time";char *pmessage = "now is the time"; /* /* 포인터 포인터 */*/

amessage: amessage:

pmessage: pmessage:

now is the time\0

now is the time\0

Page 15: 제  5 장 배열과 포인터

예제예제 (strcpy (strcpy 함수함수 ))/* strcpy: version using array subscript *//* strcpy: version using array subscript */

void strcpy(char *s, char *t)void strcpy(char *s, char *t){{int i = 0;int i = 0;

while ((s[i++] = t[i++]) != '') ;while ((s[i++] = t[i++]) != '') ;}}

/* strcpy: version using pointer *//* strcpy: version using pointer */void strcpy(char *s, char *t)void strcpy(char *s, char *t){{while ((*s++ = *t++) != '') ;while ((*s++ = *t++) != '') ;

}}

Page 16: 제  5 장 배열과 포인터

포인터 배열포인터 배열 포인터 배열포인터 배열

– 원소가 포인터인 배열원소가 포인터인 배열– 예예 ) ) 문자열 저장문자열 저장

Page 17: 제  5 장 배열과 포인터

포인터 배열의 예제포인터 배열의 예제#include <stdio.h>#include <stdio.h>main()main(){{

static char *week[] = {static char *week[] = {"Sunday","Monday","Tuesday","Wednesday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};"Thursday","Friday","Saturday"};

int k;int k;

for (k=0;k<7;k++)for (k=0;k<7;k++)printf("week[%d]=%c, %s\n",k,*week[k],week[k]);printf("week[%d]=%c, %s\n",k,*week[k],week[k]);

}}

Page 18: 제  5 장 배열과 포인터

다차원 배열다차원 배열 다차원 배열다차원 배열 (multi-dimensional array)(multi-dimensional array)

– 선언 방법선언 방법

type array-nametype array-name[[d1d1][][d2d2] ......[] ......[dndn];];– CC 는 다차원 배열을 행는 다차원 배열을 행 -- 열 순서로 저장열 순서로 저장– 예를 들어 예를 들어 22 차원 배열 차원 배열 int m[3][3]int m[3][3] 는 다음과 같이 는 다음과 같이

저장됨저장됨

Page 19: 제  5 장 배열과 포인터

다차원 배열다차원 배열 (con’d)(con’d) 다차원 배열을 인자로 갖는 함수의 형식 인자 선언다차원 배열을 인자로 갖는 함수의 형식 인자 선언

– 허용되는 인자 선언허용되는 인자 선언

void a(int m[3][3]);void a(int m[3][3]);void a(int m[][3]);void a(int m[][3]);void b(f[4][2][3]);void b(f[4][2][3]);void b(f[][2][3]);void b(f[][2][3]);void a(int (*m)[3]);void a(int (*m)[3]);

=> int (*m)[3]=> int (*m)[3] 는 는 pointer to array of size 3pointer to array of size 3 을 의미을 의미void b(int (*f)[2][3]);void b(int (*f)[2][3]); => int (*f)[2][3]=> int (*f)[2][3] 는 는 pointer to array of 2d array of [2][3]pointer to array of 2d array of [2][3] 을 의 미 을 의 미

Page 20: 제  5 장 배열과 포인터

포인터와 포인터와 22 차원 배열차원 배열 22 차원 배열 차원 배열 int a[10][20];int a[10][20];

– aa 는 는 22 차원 배열로서 차원 배열로서 10×2010×20 개의 정수를 저장할 개의 정수를 저장할 수 있는 기억 공간을 차지수 있는 기억 공간을 차지

– a[row][col]a[row][col] 에 해당하는 원소를 참조하기 위해 에 해당하는 원소를 참조하기 위해 20×20×rowrow ++ colcol 의 위치 계산의 위치 계산

포인터 포인터 int *b[10];int *b[10];– bb 는 는 1010 개의 포인터만을 저장할 수 있는 기억 개의 포인터만을 저장할 수 있는 기억

공간을 할당받음공간을 할당받음– 각 행이 가리키는 배열의 길이가 각기 다를 수 있다각 행이 가리키는 배열의 길이가 각기 다를 수 있다

Page 21: 제  5 장 배열과 포인터

포인터와 포인터와 22 차원 배열차원 배열 (con’d)(con’d) 포인터와 포인터와 22 차원 배열의 기억 장소 사용차원 배열의 기억 장소 사용

char *name[] = "Christoper", "Michael", "John", "Tom" ;char *name[] = "Christoper", "Michael", "John", "Tom" ;

char aname[][11] = "Christoper", "Michael", "John", "Tom" ;char aname[][11] = "Christoper", "Michael", "John", "Tom" ;

Page 22: 제  5 장 배열과 포인터

포인터와 포인터와 22 차원 배열차원 배열 (con’d)(con’d)char aname[][11] = {"Christoper", "Michael", "John", "Tom”} ;char aname[][11] = {"Christoper", "Michael", "John", "Tom”} ;

Page 23: 제  5 장 배열과 포인터

명령행명령행 (command line) (command line) 인자인자 명령행 인자를 처리하기 위한 명령행 인자를 처리하기 위한 mainmain 함수의 형태함수의 형태

– main(int argc, char *argv[])main(int argc, char *argv[])– argcargc 는 명령행에서 입력된 토큰의 갯수를 의미는 명령행에서 입력된 토큰의 갯수를 의미– argvargv 는 입력된 각 토큰들의 포인터를 저장하고 있는 배열는 입력된 각 토큰들의 포인터를 저장하고 있는 배열– argcargc 는 항상 는 항상 11 이상의 값을 갖는다이상의 값을 갖는다 ..– argv[0]argv[0] 는 프로그램의 이름을 가리키는 프로그램의 이름을 가리키기 때문기 때문

명령행 입력명령행 입력 : prog arg1 arg2 arg3 : prog arg1 arg2 arg3 – argcargc 는 는 4, argv4, argv 는 다음과 같이 구성는 다음과 같이 구성

Page 24: 제  5 장 배열과 포인터

명령행 인자 사용의 예명령행 인자 사용의 예#include <stdio.h>#include <stdio.h>

main(int argc, char *argv[])main(int argc, char *argv[]){{

int i;int i;

for (i = 0; i < argc; i++)for (i = 0; i < argc; i++)printf("argv[%d] = %s%s", i, argv[i],printf("argv[%d] = %s%s", i, argv[i],

(i < argc-1) ? ", " : "");(i < argc-1) ? ", " : "");}}

Page 25: 제  5 장 배열과 포인터

제 제 66 장 구조체와 공용체장 구조체와 공용체

Page 26: 제  5 장 배열과 포인터

구조체구조체 구조체구조체 (structure)(structure)

– 여러개의 서로 연관된 변수들을 하나의 단위로 여러개의 서로 연관된 변수들을 하나의 단위로 묶어서 처리묶어서 처리

구조체의 예구조체의 예

학생 학생

Page 27: 제  5 장 배열과 포인터

구조체의 선언구조체의 선언 선언 선언

struct struct tag-nametag-name { {type variable1type variable1;;type variable2type variable2;; ......................} ;} ;

예예struct student {struct student {intint number;number;charchar dept[MAXDEPT];dept[MAXDEPT];charchar name[MAXNAME];name[MAXNAME];intint year;year;charchar address[MAXADDR];address[MAXADDR];charchar phone[MAXPHONE];phone[MAXPHONE];} ;} ;

Page 28: 제  5 장 배열과 포인터

구조체 변수 선언구조체 변수 선언 구조체 변수 선언구조체 변수 선언

– 구조체의 선언은 형구조체의 선언은 형 (type)(type) 을 정의을 정의– 구조체 선언의 오른쪽구조체 선언의 오른쪽– struct struct tag-nametag-name x, y, z ; x, y, z ;

태그태그 (tag)(tag) 의 사용의 사용– 변수들의 리스트가 없는 구조체 선언은 메모리 할당을 하지 않고 구조체의 변수들의 리스트가 없는 구조체 선언은 메모리 할당을 하지 않고 구조체의

구성요소만을 기술구성요소만을 기술– 태그를 사용한 경우에는 추후 변수 선언 가능 태그를 사용한 경우에는 추후 변수 선언 가능

struct point {struct point {int x;int x;int y;int y;} ;} ;

struct point pt;struct point pt;

Page 29: 제  5 장 배열과 포인터

구조체 변수 선언구조체 변수 선언 (con’d)(con’d) 태그를 사용하지 않은 경우태그를 사용하지 않은 경우

– 추후 변수 선언 불가능추후 변수 선언 불가능

struct {struct {int x;int x;int y;int y; } pt;} pt;

구조체 변수의 초기화구조체 변수의 초기화– 초기값에 의한 초기화초기값에 의한 초기화struct point pt = { 640, 480 } ;struct point pt = { 640, 480 } ;

– 구조체 변수에 의한 지정이나 함수의 리턴값으로 초기화 가능구조체 변수에 의한 지정이나 함수의 리턴값으로 초기화 가능

Page 30: 제  5 장 배열과 포인터

구조체 멤버구조체 멤버 구조체 멤버의 참조 구조체 멤버의 참조

– structure-namestructure-name..membermember– 예예 ) printf("x = %d, y = %d", pt.x, pt.y);) printf("x = %d, y = %d", pt.x, pt.y);

구조체의 중첩 정의구조체의 중첩 정의예예 ) ) struct rect { struct rect {

struct point pt1; struct point pt1; struct point pt2; struct point pt2;

} rectangle; } rectangle;

– 멤버의 참조멤버의 참조 : rectangle.pt1.x, rectangle.pt1.: rectangle.pt1.x, rectangle.pt1.yy

Page 31: 제  5 장 배열과 포인터

구조체에 대한 연산구조체에 대한 연산 지정문에서 하나의 단위로 복사지정문에서 하나의 단위로 복사 & & 연산자를 사용하여 주소를 얻음연산자를 사용하여 주소를 얻음 멤버를 참조멤버를 참조 함수의 인자로 전달함수의 인자로 전달 , , 함수의 리턴값함수의 리턴값 : : 복사에 복사에

의해 전달의해 전달 구조체는 비교에 사용될 수 없음구조체는 비교에 사용될 수 없음

Page 32: 제  5 장 배열과 포인터

구조체와 함수구조체와 함수 구조체를 리턴하는 함수구조체를 리턴하는 함수

struct point makepoint(int x, int y) struct point makepoint(int x, int y) {{struct point temp;struct point temp;

temp.x = x;temp.x = x;temp.y = y;temp.y = y;return temp;return temp;}}

struct point pt1;struct point pt1;pt1 = makepoint(0, 0);pt1 = makepoint(0, 0);

Page 33: 제  5 장 배열과 포인터

구조체와 함수구조체와 함수 (con’d)(con’d) 구조체의 인자 전달구조체의 인자 전달

struct point addpoint(struct point p1, struct point p2) struct point addpoint(struct point p1, struct point p2) {{p1.x += p2.x;p1.x += p2.x;p1.y += p2.y;p1.y += p2.y;return p1return p1}}

구조체의 포인터구조체의 포인터– 구조체 전체를 복사하여 전달하는 것보다 포인터를 전달하는 것이 구조체 전체를 복사하여 전달하는 것보다 포인터를 전달하는 것이

효율적효율적– 구조체의 포인터의 선언구조체의 포인터의 선언

struct point *pp;struct point *pp;

– 멤버의 참조멤버의 참조

(*(*pointer-to-structure).member-of-structurepointer-to-structure).member-of-structure pointer-to-structurepointer-to-structure->->member-of-structuremember-of-structure

Page 34: 제  5 장 배열과 포인터

구조체와 함수구조체와 함수 (con’d)(con’d) 구조체 포인터 사용의 예구조체 포인터 사용의 예 struct point pt, *pp;struct point pt, *pp;

pt = makepoint(0,0);pt = makepoint(0,0); pp = &pt;pp = &pt; printf("Point is ( %d, %d )",(*pp).x, (*pp).y);printf("Point is ( %d, %d )",(*pp).x, (*pp).y);

struct rect r, *rp = &r;struct rect r, *rp = &r;

r.pt1.x, rp->pt1.x, (r.pt1).x, (rp->pt1).x => r.pt1.x, rp->pt1.x, (r.pt1).x, (rp->pt1).x => 동일한 참조동일한 참조

Page 35: 제  5 장 배열과 포인터

구조체와 배열구조체와 배열 선언의 예선언의 예

struct ename { char last[30]; char mi; char first[20]; } ;struct ename { char last[30]; char mi; char first[20]; } ;struct person {struct person {struct ename name;struct ename name;int serialno;int serialno;char sex;char sex;} ;} ;struct person employee[MAX];struct person employee[MAX];

원소의 접근원소의 접근– employee[i].name.lastemployee[i].name.last– employee[i].serialnoemployee[i].serialno

Page 36: 제  5 장 배열과 포인터

자기 참조 구조체자기 참조 구조체 구조체는 자기자신을 멤버로 가질 수 없음구조체는 자기자신을 멤버로 가질 수 없음 자기 참조 구조체자기 참조 구조체 (self-referential structure)(self-referential structure)

– 자기자신을 가리키는 포인터를 멤버로 가지는 구조체자기자신을 가리키는 포인터를 멤버로 가지는 구조체– 리스트리스트 (list)(list) 나 트리나 트리 (tree)(tree) 와 같은 자료 구조를 와 같은 자료 구조를

구현에 사용구현에 사용struct book { struct book { /* /* 자기 참조 구조체 자기 참조 구조체 */*/char title[80];char title[80];char author[80];char author[80];struct book *nextbook;struct book *nextbook;} ;} ;

Page 37: 제  5 장 배열과 포인터

sizeofsizeof sizeof sizeof 연산자연산자

– 컴파일시 대상의 크기를 계산하는 연산자컴파일시 대상의 크기를 계산하는 연산자– sizeof sizeof objectobject 또는 또는 sizeof(sizeof(objectobject))– 데이타형의 크기를 바이트 단위로 계산한 데이타형의 크기를 바이트 단위로 계산한

정수값을 의미정수값을 의미– ex) int n;ex) int n;

sizeof(n) sizeof(n) 또는 또는 sizeof(int) => intsizeof(int) => int 형의 바이트 크기형의 바이트 크기

Page 38: 제  5 장 배열과 포인터

typedeftypedef 새로운 데이타형을 정의하는데 사용새로운 데이타형을 정의하는데 사용

– typedef int Length;typedef int Length;– intint 형과 동일한 형과 동일한 LengthLength 라는 새로운 데이타형을 라는 새로운 데이타형을

만드는 것만드는 것

Length len, maxlen;Length len, maxlen;Length *lengths[];Length *lengths[];

– typedef char * String;typedef char * String;– charchar 형의 포인터형에 해당하는 형의 포인터형에 해당하는 StringString 형을 정의형을 정의

String p, lineptr[10];String p, lineptr[10];

Page 39: 제  5 장 배열과 포인터

typedef(con’d)typedef(con’d) typedeftypedef 와 와 #define#define 의 차이점의 차이점

– #define String#define String char *char *– String p, lineptr[10]; => char * p, lineptr[10]String p, lineptr[10]; => char * p, lineptr[10] 의 의미를 나타냄의 의미를 나타냄– typedeftypedef 의 예의 예

typedef struct {typedef struct {double real;double real; /* /* 실수부 실수부 */*/double imag;double imag; /* /* 허수부 허수부 */*/ } COMPLEX;} COMPLEX;

COMPLEX complex_add(COMPLEX a, COMPLEX b)COMPLEX complex_add(COMPLEX a, COMPLEX b){{a.real += b.real;a.real += b.real;a.imag += b.imag;a.imag += b.imag;return a;return a;}}

Page 40: 제  5 장 배열과 포인터

공용체공용체 선언선언

union union tag-nametag-name { {type variable1type variable1;;type variable2type variable2;; ......................} ;} ;

구조체와 다른점구조체와 다른점 : : 공용체내의 멤버들은 동일한 기억 공용체내의 멤버들은 동일한 기억 장소를 공유장소를 공유– 공용체의 멤버를 참조하는 방법은 구조체와 동일공용체의 멤버를 참조하는 방법은 구조체와 동일

union-nameunion-name..membermemberunion-pointerunion-pointer->->membermember

Page 41: 제  5 장 배열과 포인터

공용체 사용예공용체 사용예#include <stdio.h>#include <stdio.h>

#define STRING#define STRING 00#define INTEGER#define INTEGER 11#define FLOATING#define FLOATING 22

struct {struct {int type;int type;union {union {char *sval;char *sval;int ival;int ival;float fval;float fval;} u;} u;} val;} val;

Page 42: 제  5 장 배열과 포인터

공용체 사용예공용체 사용예 (con’d)(con’d)main()main(){{..............................if (val.type == STRING)if (val.type == STRING)printf("Value = %s",val.u.sval);printf("Value = %s",val.u.sval);else if (val.type == INTEGER)else if (val.type == INTEGER)printf("Value = %d",val.u.ival);printf("Value = %d",val.u.ival);else if (val.type == FLOATING)else if (val.type == FLOATING)printf("Value = %f",val.u.fval);printf("Value = %f",val.u.fval);else printf("bad type : %d",val.type);else printf("bad type : %d",val.type);................................}}