쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
이중 포인터 이중 포인터(double pointer): 포인터를 가리키는 포인터 int i = 100; // i는 int형 변수 int *p = &i; // p는 i를 가리키는 포인터 int **q = &p; // q는 포인터 p를 가리키는 이중 포인터 Slide 2 (of 22)
이중 포인터 // 이중 포인터 프로그램 #include <stdio.h> int main(void) { int i = 100; int *p = &i; int **q = &p; *p = 200; printf("i=%d *p=%d **q=%d \n", i, *p, **q); **q = 300; return 0; } i=200 *p=200 **q=200 i=300 *p=300 **q=300 Slide 3 (of 22)
포인터 배열 포인터 배열(array of pointers): 포인터를 모아서 배열로 만든것 int a = 10, b = 20, c = 30, d = 40, e = 50; int *pa[5] = { &a, &b, &c, &d, &e }; Slide 4 (of 22)
문자열 배열 문자열 배열 가장 많이 사용되는 포인터 배열 문자열들을 효율적으로 저장할 수 있다. char *fruits[ ] = { "apple", "blueberry", "orange", “melon" }; Slide 5 (of 22)
문자열 상수의 의미 문자열 상수는 문자열의 시작 번지를 반환한다. 포인터 배열의 각 원소들은 이 시작 번지로 초기화된다. Slide 6 (of 22)
함수 포인터 함수 포인터(function pointer): 함수를 가리키는 포인터 반환형 (*함수포인터이름)(매개변수1, 매개변수2, ...); Slide 7 (of 22)
fp1.c // 함수 포인터 #include <stdio.h> // 함수 원형 정의 int add(int, int); int sub(int, int); int main(void) { int result; int (*pf)(int, int); // 함수 포인터 정의 pf = add; // 함수 포인터에 함수 add()의 주소 대입 result = pf(10, 20); // 함수 포인터를 통한 함수 add() 호출 printf("10+20은 %d\n", result); pf = sub; // 함수 포인터에 함수 sub()의 주소 대입 result = pf(10, 20); // 함수 포인터를 통한 함수 sub() 호출 printf("10-20은 %d\n", result); return 0; } Slide 8 (of 22)
fp1.c int add(int x, int y) { return x+y; } int sub(int x, int y) 10+20은 30 10-20은 -10 Slide 9 (of 22)
다차원 배열과 포인터 2차원 배열 int m[3][3] 1행->2행->3행->...순으로 메모리에 저장(행우선 방법) Slide 10 (of 22)
2차원 배열과 포인터 배열 이름 m은 &m[0][0] m[0]는 1행의 시작 주소 m[1]은 2행의 시작 주소 ... Slide 11 (of 22)
multi_array.c // 다차원 배열과 포인터 #include <stdio.h> int main(void) { printf("m = %p\n", m); printf("m[0] = %p\n", m[0]); printf("m[1] = %p\n", m[1]); printf("m[2] = %p\n", m[2]); printf("&m[0][0] = %p\n", &m[0][0]); printf("&m[1][0] = %p\n", &m[1][0]); printf("&m[2][0] = %p\n", &m[2][0]); return 0; } m = 1245020 m[0] = 1245020 m[1] = 1245032 m[2] = 1245044 &m[0][0] = 1245020 &m[1][0] = 1245032 &m[2][0] = 1245044 Slide 12 (of 22)
2차원 배열과 포인터 연산 m에 대한 연산의 의미 m은 &m[0][0] m+1은 m[1] m+2은 m[2] Slide 13 (of 22)
two_dim_array.c #include <stdio.h> int main(void) { printf("m = %p\n", m); printf("m+1 = %p\n", m+1); printf("m+2 = %p\n", m+2); printf("m[0] = %p\n", m[0]); printf("m[1] = %p\n", m[1]); printf("m[2] = %p\n", m[2]); return 0; } m = 1245020 m+1 = 1245032 m+2 = 1245044 m[0] = 1245020 m[1] = 1245032 m[2] = 1245044 Slide 14 (of 22)
void 포인터 순수하게 메모리의 주소만 가지고 있는 포인터 가리키는 대상물은 아직 정해지지 않음 (예) void *vp; 다음과 같은 연산은 모두 오류이다. *vp; // 오류 *(int *)vp; // void형 포인터를 int형 포인터로 변환한다. vp++; // 오류 vp--; // 오류 Slide 15 (of 22)
vp.c #include <stdio.h> int main(void) { int a[] = { 10, 20, 30, 40, 50 }; void *vp; vp = a; // 가능 vp = &a[2]; // 가능 *vp = 35; // 오류 vp++; // 오류 *(int *)vp = 35; // 가능 return 0; } Slide 16 (of 22)
main() 함수의 인수 지금까지의 main() 함수 형태 외부로부터 입력을 받는 main() 함수 형태 int main(void) { .. } int main(int argc, char *argv[]) { .. } Slide 17 (of 22)
인수 전달 방법 C: \cprogram> mycopy src dst Slide 18 (of 22)
main_arg.c #include <stdio.h> int main(int argc, char *argv[]) { int i = 0; for(i = 0;i < argc; i++) printf("명령어 라인에서 %d번째 문자열 = %s\n", i, argv[i]); return 0; } Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. c:\cprogram\mainarg\Debug>mainarg src dst 명령어 라인에서 0번째 문자열 = mainarg 명령어 라인에서 1번째 문자열 = src 명령어 라인에서 2번째 문자열 = dst c:\cprogram\mainarg\Debug> Slide 19 (of 22)
비주얼 C++ 프로그램 인수 입력 방법 Slide 20 (of 22)
mile2km.c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { double mile, km; if( argc != 2 ){ printf("사용 방법: mile2km 거리\n"); return 1; } mile = atof(argv[1]); km = 1.609 * mile; printf("입력된 거리는 %f km입니다. \n", km); return 0; Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. c:\cprogram\mainarg\Debug>mainarg 10 입력된 거리는 16.090000 km입니다. c:\cprogram\mainarg\Debug> Slide 21 (of 22)
Q & A Slide 22 (of 22)