25
© 2015 생능출판사 All rights reserved CHAPTER 20 포인터와 배열 이해하기

쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

CHAPTER 20 포인터와 배열 이해하기

Page 2: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

포인터와 배열

배열과 포인터는 아주 밀접한 관계를 가지고 있다.

배열 이름이 바로 포인터이다.

포인터는 배열처럼 사용이 가능하다.

배열 포인터

[0] [1]

a

[2] [3] [4] [5] [6] [7] [8]

p

배열

포인터

Page 3: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

포인터와 배열 // 포인터와 배열의 관계

#include <stdio.h>

int main(void)

{

int a[] = { 10, 20, 30, 40 };

printf("&a[0] = %u\n", &a[0]);

printf("&a[1] = %u\n", &a[1]);

printf("&a[2] = %u\n", &a[2]);

printf("a = %u\n", a);

return 0;

}

&a[0] = 3340364

&a[1] = 3340368

&a[2] = 3340372

a = 3340364

Page 4: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

배열의 이름은 포인터?

#include <stdio.h>

int main(void)

{

int a[] = { 10, 20, 30, 40 };

printf("*a = %u\n", *a);

printf("*(a+1) = %u\n", *(a+1));

printf("*(a+2) = %u\n", *(a+2));

return 0;

}

*a = 10

*(a+1) = 20

*(a+2) = 30

Page 5: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

포인터와 배열

포인터는 배열처럼 사용할 수 있다.

인덱스 표기법을 포인터에 사용할 수 있다.

Page 6: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

포인터를 배열처럼 사용 #include <stdio.h>

int main(void)

{

int a[] = { 10, 20, 30, 40 };

int *p;

p = a;

printf("a[0]=%d a[1]=%d a[2]=%d \n", a[0], a[1], a[2]);

printf("p[0]=%d p[1]=%d p[2]=%d \n\n", p[0], p[1], p[2]);

return 0;

}

a[0]=10 a[1]=20 a[2]=30 p[0]=10 p[1]=20 p[2]=30

배열은 결국 포인터로

구현된다는 것을 알 수

있다.

Page 7: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

배열 매개 변수

일반 매개 변수 vs 배열 매개 변수

Why? -> 배열을 함수로 복사하려면 많은 시간 소모

// 매개 변수 x에 기억 장소가 할당

void sub(int x)

{

...

}

// b에 기억 장소가 할당되지 않는다.

void sub( int b[] )

{

...

}

Page 8: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

예제 #include <stdio.h>

void update_array(int x[])

{

x[0] = 99;

}

int main(void)

{

int a[] = { 10, 20, 30, 40, 50 };

update_array(a);

printf("a[0]=%d a[1]=%d a[2]=%d \n", a[0], a[1], a[2]);

return 0;

} 1 2 3 4 5 6 a[0]=99 a[1]=20 a[2]=30

Page 9: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

핵심예제: 배열 요소 합

배열을 인수로 받아서 배열 원소의 합을 계산하여 반환하는 함수

get_sum()을 작성하고 테스트하여 보자.

1 2 3 4 5 6 a[0]=99 a[1]=20 a[2]=30

Page 10: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

핵심예제: 배열 요소 합 #include <stdio.h>

int get_sum(int a[], int n);

int main(void)

{

int data[] = { 10, 20, 30, 40, 50 };

int value;

value = get_sum(data, 5);

printf("%d \n", value);

return 0;

}

int get_sum(int a[], int n)

{

int i;

int sum = 0;

for (i = 0; i < n; i++)

sum += a[i];

return sum;

}

1 2 3 4 5 6 a[0]=99 a[1]=20 a[2]=30

Page 11: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

핵심예제: 배열 요소 합

배열을 인수로 받아서 배열 원소의 합을 계산하여 반환하는 함수

get_sum()을 작성하고 테스트하여 보자. 이번에는 포인터로 받는다.

Page 12: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

예제 소스 #include <stdio.h>

int get_sum(int *p, int n);

int main(void)

{

int data[] = { 10, 20, 30, 40, 50 };

int value;

value = get_sum(data, 5);

printf("%d \n", value);

return 0;

}

int get_sum(int *p, int n)

{

int i;

int sum = 0;

for (i = 0; i < n; i++)

sum += *(p+i);

return sum;

}

Page 13: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

Lab: 평균과 표준편차

이번 실습에서는 학생들의 성적을 난수로 생성하고 성적의 평균과 표준편차를 계산하는 프로그램을 작성하여 보자.

Page 14: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

핵심예제: 배열 요소 합 #include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

#define N_DATA 10

void get_data(double data[]);

void print_data(double data[]);

double get_mean(double data[]);

double get_std_dev(double data[], double mean);

int main(void)

{

double data[20];

double mean;

srand((unsigned)time(NULL));

get_data(data);

print_data(data);

mean = get_mean(data);

printf("평균값은 %lf\n", mean);

printf("표준편차값은 %lf\n", get_std_dev(data, mean));

return 0;

}

Page 15: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

핵심예제: 배열 요소 합

void get_data(double data[])

{

int i;

for (i = 0; i<N_DATA; i++){

data[i] = rand() % 100;

}

}

void print_data(double data[])

{

int i;

printf("( ");

for (i = 0; i<N_DATA; i++){

printf("%.2lf ", data[i]);

}

printf(")\n");

}

double get_mean(double data[])

{

int i;

double sum = 0.0;

for (i = 0; i<N_DATA; i++){

sum += data[i];

}

return sum / N_DATA;

}

Page 16: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

핵심예제: 배열 요소 합

double get_std_dev(double data[], double mean)

{

int i;

double sum = 0.0;

for (i = 0; i<N_DATA; i++){

sum += (data[i] - mean)*(data[i] - mean);

}

return sqrt(sum / N_DATA);

}

Page 17: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

Lab: 영상 처리

디지털 이미지는 배열을 사용하여서 저장된다.

이미지 처리를 할 때 속도를 빠르게 하기 위하여 포인터를 사용한다.

이미지 내의 모든 픽셀의 값을 10씩 증가시켜보자.

Page 18: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

실행 결과

010 020 030 040 050

010 020 030 040 050

010 020 030 040 050

010 020 030 040 050

010 020 030 040 050

020 030 040 050 060

020 030 040 050 060

020 030 040 050 060

020 030 040 050 060

020 030 040 050 060

모든

픽셀의

값이 10씩

증가되었다.

Page 19: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

실습: 영상 처리

#include <stdio.h>

#define SIZE 5

void print_image(int image[][SIZE])

{

int r,c;

for(r=0;r<SIZE;r++){

for(c=0;c<SIZE;c++){

printf("%03d ", image[r][c]);

}

printf("\n");

}

printf("\n");

}

Page 20: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

실습: 영상 처리

void brighten_image(int image[][SIZE])

{

int r,c;

int *p;

p = &image[0][0];

for(r=0;r<SIZE;r++){

for(c=0;c<SIZE;c++){

*p += 10;

p++;

}

}

}

Page 21: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

실습: 영상 처리

int main(void)

{

int image[5][5] = {

{ 10, 20, 30, 40, 50},

{ 10, 20, 30, 40, 50},

{ 10, 20, 30, 40, 50},

{ 10, 20, 30, 40, 50},

{ 10, 20, 30, 40, 50}};

print_image(image);

brighten_image(image);

print_image(image);

return 0;

}

Page 22: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

함수 포인터

함수 포인터(function pointer): 함수를 가리키는 포인터

int (*pf)(int, int);

Page 23: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

함수 포인터의 해석

Page 24: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

함수 포인터 예제 #include <stdio.h>

int get_min(int, int);

int main(void)

{

int n1, n2, result;

int(*pf)(int, int);

printf("첫 번째 값: ");

scanf("%d", &n1);

printf("두 번째 값: ");

scanf("%d", &n2);

pf = get_min;

result = pf(n1, n2);

printf("더 작은 값은 %d입니다.\n", result);

return 0;

}

int get_min(int a, int b)

{

if (a < b)

return a;

else

return b;

}

첫 번째 값: 10

두 번째 값: 20

더 작은 값은 10입니다.

Page 25: 쉽게 풀어쓴 C 프로그래밍program201701.lucidotech.kr/lesson/chapter_20.pdf · 핵심예제: 배열 요소 합 배열을 인수로 받아서 배열 원소의 합을 계산하여

© 2015 생능출판사 All rights reserved

Q & A