• 검색 결과가 없습니다.

8강. 포인터로 함수 넘나들기

N/A
N/A
Protected

Academic year: 2022

Share "8강. 포인터로 함수 넘나들기"

Copied!
12
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

C 언어 포인터 정복하기

TAE-HYONG KIM

COMPUTER ENG, KIT

8강. 포인터로 함수 넘나들기

(2)

학습 내용

 포인터를 통한 함수 호출

 포인터 인자를 사용하는 함수 예

 배열을 인자로 하는 함수 호출 분석

 배열 인자를 함수에서 포인터로 다루기

2

(3)

scanf()와 printf()

 scanf()

 사용자가 입력할 정수 값을 저장할 변 수 a의 포인터(&a: 시작주소, 자료형) 를 scanf()함수에게 인자로 넘겨주어 호 출한다

 scanf()함수 내부 포인터변수에 인자로 받은 포인터가 저장되고 scanf()함수는 사용자에게 입력 받은 정수를 해당 위 치에 복사한다  a값 변경됨

 포인터를 인자로 하는 함수 호출:

참조 에 의한 호출 (Call by Reference)

3

int a = 0;

printf(“정수값을 입력하세요: ”);

scanf(“%d”, &a);

printf(“%d”, a);

scanf(“%d”, &a);

변수

포인터변수에 저장

포인터

입력

(4)

scanf()와 printf() (2)

 printf()

 화면에 출력해야 할 변수 값(a)을 printf()함수에게 인자로 넘겨주어 호출한다

 printf() 함수 내부 변수에 인자로 받은 정수 값이 저장되고 printf() 함수는 그 값을 화면에 출력한다 (printf()함수는 외부 변수 a에 영

향을 줄 수 없다)

 값을 인자로 하는 함수 호출: 값에

의한 호출 (call by value)

4

int a = 0;

printf(“정수값을 입력하세요: ”);

scanf(“%d”, &a);

printf(“%d”, a);

printf(“%d”, a);

변수

내부변수에 저장

접근불가

(5)

포인터를 통한 함수 호출

 인자로 주어지는 포인터 값을 받기 위해

피호출 함수는 포인터변수를 인자로 선언 해야 한다

5

int main(void) { int a = 0;

...

func(&a);

...

}

10 11 12 13 14

100 101 102 103 104

main() func()

void func(int *a) { ...

*a = 20;

...

}

a 0

a 10

20

(6)

포인터 인자를 사용하는 함수 예

6

패턴 12

두 변수의 값을 바꾸는 함수(swap)

#include <stdio.h>

void swap(int *, int *);

int main(void) {

int val1=10, val2=20;

swap(&val1, &val2);

printf(“val1:%d,val2:%d\n”, val1, val2);

return 0;

}

void swap(int *a, int *b) {

int temp = *a;

*a = *b;

*b = temp;

}

(7)

배열을 인자로 하는 함수 호출

 배열 이름이 함수 인자로 사용될 때(R-value)

 배열의 첫 번째 요소를 가리키는 포인터상수

 배열이라는 정보 자체가 존재하지 않음

 포인터상수를 함수 인자로 받기 위해서 포인터 변수가 필요

 parr은 arr[0]을 가리키는 포인터를 갖는다

 parr을 arr 대신 배열이름으로 사용하여 접근 가능

7

int sum, arr[] = { 3, 4, 5, 6, 7 };

sum = arrSum(arr, sizeof(arr)/sizeof(arr[0]));

int arrSum(int arr[], int arrSize) { ...

int arrSum(int *parr, int arrSize) { ...

... sum += parr[i]; // sum += *(parr+i);

(8)

배열 인자를 포인터로 저장하는 함수 예

8

패턴 1-3

배열의 평균을 구하는 함수

#include <stdio.h>

double average(int *, int);

int main(void) {

int arr[] = { 3, 4, 5, 6, 7 };

int *p = arr, size;

size = sizeof(arr)/sizeof(p[0]);

printf(“average: %.2f\n”, average(arr, size));

return 0;

}

double average(int *val, int size) {

int r, sum = 0;

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

sum += *(val+i); // sum += val[i];

return (double)sum/size;

}

(9)

배열 인자를 포인터로 저장하는 함수 예(2)

패턴 6-1

일차원 배열 내림차순으로 정렬하는 함수

#include <stdio.h>

extern void swap(int *, int *);

void sort(int *, int);

int main(void) {

int arr[] = { 25, 17, 32, 58, 41 }, i, size;

size = sizeof(arr)/sizeof(arr[0]);

sort(arr, size);

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

printf(“arr[%]=%d\n”, i, arr[i]);

return 0;

}

void sort(int *val, int size) {

int i, j;

for (i=0; i<size-1; i++) // 가장 큰 수가 될 변수 for (j=i+1; j<size; j++) // 비교되는 수

if (val[i]<val[j]) // if (*(val+i)<*(val+j))

swap(&val[i], &val[j]); // swap(val+i, val+j);

}

(10)

배열 인자를 포인터로 저장하는 함수 예(2)

패턴 9-1

문자열 뒤집어 저장하는 함수

#include <stdio.h>

#include <string.h> // for strlen() extern void swapchar(char *, char *);

void revstr(char *);

int main(void) {

char str[] = “hello”;

revstr(str);

printf(“reversed str = %s\n”, str);

return 0;

}

void revstr(char *str) {

int len, i;

len = strlen(str); // or len = sizeof(str)-1;

for (i=0; i<len/2; i++) // 중간문자까지 swapchar(&str[i], &str[len-1-i]);

} // swapchar(str+i, str+len-1-i);

(11)

포인터 인자 함수 호출 정리

 함수 인자로 포인터 변수를 써야 하는 경우

 변수의 포인터로 인자로 넘길 때 (&a)

 포인터 변수를 인자로 넘길 때 (p)

 1차원 배열 이름을 인자로 넘길 때(arr)

 1차원 배열 이름을 인자로 함수 호출할 때 함수 인자

 크기 없는 배열 (arr[])  배열명, 포인터로 모두 사용가능

 포인터 변수(*arr)  배열명, 포인터로 모두 사용가능

 남은 함수 인자 결정 문제

 문자열 상수(“hello”)를 인자로 함수 호출할 때(printf()등)

 이차원 배열 이름을 인자로 함수 호출할 때

11

(12)

다음 강의 소개

 9강. 포인터로 문자열 다루기

 문자열 상수의 정체

 문자열처리 함수 분석하기

 포인터변수 상수화 하기

 포인터를 반환하기

 문자열처리 함수 소개

12

참조

관련 문서

XML 문서 내를 여러 가지 마크업 언어로 작성할 때, 동일 한 이름을 가지고 있는 엘리먼트가 각기 다른 마크업 언어 에서 같이 사용될

We found a high prevalence of elevations of thyroid function and thyroid autoantibodies in adult MMD, especially in ischemic MMD. Although a genetic role and immunologic

실행 중인

만일 이 대응관계가 함수이면, 정의역,

• 예를 들어, 1부터 n까지의 합을 구하는 프로그램에서 n을 입력 받는 서브 프로그램, n까지 합하는 서브 프로그램, 결과 를 출력하는 서브 프로그램 등으로 기능을 분리할 수 있음.

다음

이와 같이 표준용량 두배의 양성자펌프억제제 사용에도 증상이 호전되지 않거나 병변이 개선되지 않는 경우를 난치성 위식 도역류질환(refractory gastroesophageal reflux

[r]