Summary of Pointers and Arrays adopted from KNK C Programming : A Modern Approach
Copyright © 2008 W. W. Norton & Company. All rights reserved. 내용 배열 되짚어 보기 포인터 되짚어 보기 포인터와 배열 배열을 함수의 인자로 전달 다차원 배열 포인터와 가변 길이 배열 Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 배열 되짚어 보기 배열: 같은 형의 값을 여러 개 저장할 수 있는 것과 그것의 시작 주소 Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 배열 되짚어 보기 배열: 같은 형의 값을 여러 개 저장할 수 있는 것과 그것의 시작 주소 int foo[]= {380, 800, 777}; 777 800 주소 380 0x000 0x004 0x008 0x00c 변수명 foo foo[0] foo[1] foo[2] Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 포인터 되짚어 보기 Pointer 가리키는 사람, 지적자, (무언가를)가리키는 막대기 포인터 변수 일반적으로 값을 저장하는 변수와 달리 주소를 저장하고 다루는 특수한 변수 707 주소 0x000 0x004 0x008 0x00c 변수명 int foo = 707; foo Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 포인터 되짚어 보기 Pointer 가리키는 사람, 지적자, (무언가를)가리키는 막대기 포인터 변수 일반적으로 값을 저장하는 변수와 달리 주소를 저장하고 다루는 특수한 변수 707 주소 0x00c 0x000 0x004 0x008 변수명 foo p int foo = 707; int *p; p = &foo; Copyright © 2008 W. W. Norton & Company. All rights reserved.
배열: 포인터와의 관계 int foo[]= {380, 800, 777}; 777 800 주소 380 0x000 0x004 0x00c 변수명 foo foo[0] foo[1] foo[2] foo + 0 x 4 byte foo + 1 x 4 byte foo + 2 x 4 byte 변수의 시작 주소를 사용한 변환 기준 위치로 부터 X만큼 떨어진 위치를 접근할 수 있음 Copyright © 2008 W. W. Norton & Company. All rights reserved.
포인터변수명 + 인덱스 x 타입의크기 배열: 포인터와의 관계 공식 int foo[]= {380, 800, 777}; 777 주소 380 0x000 0x004 0x008 0x00c 변수명 foo foo[0] foo[1] foo[2] foo + 0 x 4 byte foo + 1 x 4 byte foo + 2 x 4 byte 변수의 시작 주소를 사용한 변환 기준 위치로 부터 X만큼 떨어진 위치를 접근할 수 있음 공식 포인터변수명 + 인덱스 x 타입의크기 Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 포인터의 덧셈과 뺄셈 int foo[]= {10, 20, 30, 40, 50, 70, 80}; 80 70 60 50 40 30 20 10 0x00 0x04 0x08 0x0c 0x10 0x14 0x18 foo[0] foo[1] foo[2] foo[3] foo[4] foo[5] foo[6] foo[7] Address foo index Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 포인터의 덧셈과 뺄셈 int foo[]= {10, 20, 30, 40, 50, 70, 80}; int *p, *q; 80 70 60 50 40 30 20 10 0x00 0x04 0x08 0x0c 0x10 0x14 0x18 foo[0] foo[1] foo[2] foo[3] foo[4] foo[5] foo[6] foo[7] 0xc8 0xe8 p q Address foo index Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 포인터의 덧셈과 뺄셈 int foo[]= {10, 20, 30, 40, 50, 70, 80}; int *p, *q; p = &foo[3]; q = p + 2; 80 70 60 50 40 30 20 10 0x00 0x04 0x08 0x0c 0x10 0x14 0x18 foo[0] foo[1] foo[2] foo[3] foo[4] foo[5] foo[6] foo[7] 0xc8 0xe8 0x0c 0x10 p q Address foo index Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 포인터의 덧셈과 뺄셈 int foo[]= {10, 20, 30, 40, 50, 70, 80}; int *p, *q; p = &foo[3]; q = p + 2; p -= 2; 80 70 60 50 40 30 20 10 0x00 0x04 0x08 0x0c 0x10 0x14 0x18 foo[0] foo[1] foo[2] foo[3] foo[4] foo[5] foo[6] foo[7] 0xc8 0xe8 0x04 0x10 p q Address foo index Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 포인터의 덧셈과 뺄셈 int foo[]= {10, 20, 30, 40, 50, 70, 80}; int *p, *q; p = &foo[5]; q = &foo[2]; printf(“%d”, p – q); 80 70 60 50 40 30 20 10 0x00 0x04 0x08 0x0c 0x10 0x14 0x18 foo[0] foo[1] foo[2] foo[3] foo[4] foo[5] foo[6] foo[7] 0xc8 0xe8 0x10 0x08 p q Address 3 foo index Copyright © 2008 W. W. Norton & Company. All rights reserved.
Example of Array Processing with Pointers #define N 10 … int a[N], sum, *p; sum = 0; for (p = &a[0]; p < &a[N]; p++) sum += *p; Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 연산자의 결합 Translate the following sentence to a pointer form 해석: foo 배열의 i 번째 인덱스의 값을 j로 갱신 i의 인덱스 값을 1 증가 변환: foo[i]는 p가 가리킴 (p = &foo[i];) 현재 인덱스에 p를 저장 (*p = j;) p가 다음 인덱스를 가리키도록 증가 (p = p + 1) 2와 3을 결합 (*p++ = j, ++가 * 보다 우선순위가 높음) p = &foo[i] // p is pointer variable foo[i++] = j; Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 연산자의 결합 (exercise) Expression Meaning *p++ or *(p++) (*p)++ *++p or *(++p) ++*p or ++(*p) *p를 사용하고 p를 증가 *p를 사용하고 *p를 증가 p를 증가하고; 증가된 *p를 사용 *p를 증가하고; 증가된 *p를 사용 Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 배열을 함수의 인자로 전달 Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 배열을 함수의 인자로 전달하기 int find_largest(int a[], int n) { int i, max; max = a[0]; for (i = 1; i < n; i++) if (a[i] > max) max = a[i]; return max; } int main(void) … largest = find_largest(b, N); 함수의 원형에는 배열이라는 것을 명시 주소라는 정보만으로는 배열인지 알 수 없음 마찬가지로 배열의 길이도 알 수 없음 배열로 선언된 변수는 주소를 다룸 함수에 인자로 주소 값만 전달하면 됨 Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 함수 인자로 배열은 포인터처럼 동작 의미 1: 배열은 주소이기 때문에 함수가 쓰는 매개변수에 의해 배열의 값이 변경됨 int main(void){ int foo = 10; int baz[2] = {0}; go(foo); gon(baz); } int go(int bar){ bar++; } int gon(int bar[]){ bar[1]++; } bar = 10 bar++ go(foo); foo = 10 main()의 공간 go()의 foo의 값이 bar로 복사됨 bar = baz bar[1]++ gon(baz); baz[0]=0 main()의 공간 baz[1]=0 go()의 baz의 주소가 bar로 복사됨 실제 위치의 값 변경 Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 함수 인자로 배열은 포인터처럼 동작 의미 2: 주소만 전달되기 때문에 배열의 크기와 속도는 관계 없음 의미 3: 매개변수를 포인터로 선언 할 수 있음 int gon(int bar[], int n){ bar[1]++; } int main(void){ int foo = 10; int baz[2] = {0}; gon(baz, 3); int gon(int* bar, int n){ bar[1]++; } int main(void){ int foo = 10; int baz[2] = {0}; gon(baz, 3); Copyright © 2008 W. W. Norton & Company. All rights reserved.
Copyright © 2008 W. W. Norton & Company. All rights reserved. 함수 인자로 배열은 포인터처럼 동작 의미 4: 배열의 일부만 전달 할 수 있음 int gon(int bar[], int n){ bar[1]++; } int main(void){ int foo = 10; int baz[10] = {0}; gon(&baz[5], 3); Copyright © 2008 W. W. Norton & Company. All rights reserved.