C언어: 포인터의 활용 - 예제

    배열을 포인터로 전달해서 직접 함수 호출 

    1. 정수 5개로 이루어진 배열에 대해 다음 조건을 만족하는 프로그램을 작성하시오.

    - 포인터를 이용해서 배열을 전달하고, 평균, 최솟값, 최댓값을 계산할 것

    - 평균은 실수형으로 계산하고 소수 첫째 자리까지 출력할 것

    - main() 에서 포인터 초기화 후 함수를 호출하고 결과를 출력할 것

    /*다음과 같이 포인터로 배열 데이터 주소를 함수에 넘기시오*/
    int *p = num; //배열명==주소
    average = avr(p);

     

    <답안>

    #include <stdio.h>
    #define N 5
    
    //함수 선언: 포인터를 받아 평균, 최소, 최대, 총합을 계산하는 함수 - 배열을 포인터로 받아서 접근
    float avr(int *v); 
    int min(int *v); 
    int max(int *v);
    int total(int *v);
    
    int main(void) {
    	int num[N] = { 1, 2, 3, 4, 5 }; //배열 선언
    	int *p = num; //배열을 참조하는 포인터 선언
    	float average; //평균 - 실수형
    	int min_y, max_y; //최소, 최대 - 정수형
    
    	average = avr(p); //함수 호출 - 포인터 p를 인자로 전달
    	min_y = min(p);
    	max_y = max(p);
    
    	printf("average: %.1f, min: %d, max: %d\n", average, min_y, max_y); //결과 출력
    	system("pause");
    	return 0;
    }
    
    //총합 구하는 함수
    int total(int *v) {
    	int s = 0; //결과값을 저장할 변수 선언
        
    	for (int i = 0; i < N; i++)
    		s += *v++;  //포인터 연산을 통해 배열의 다음 요소로 이동하며 총합 계산
    	return s; 
    }
    
    float avr(int *v) {
    	int sum;
    	float a;
    	sum = total(v);  //total 함수 호출
    	a = (float)sum / (float)N; //형변환
    	return a; 
    }
    
    int min(int *v) {
    	int m = *v; //첫 번째 값을 m에 대입해 초기 최솟값으로 설정
    	for (int i = 1; i < N; i++) 
    		v++; //포인터 다음 위치로 이동 
            if(m>*v) //현재 값이 이전 최솟값보다 작다면 
            	m=*v; //최솟값 갱신
    	return m;
    }
    
    int max(int *v) {
    	int m = *v;
    	for (int i = 1; i < N; i++)
    		v++;
            if(m<*v)
            	m=*v;
    	return m;
    }

     

    함수 주소를 저장하고, 간접 호출하는 함수 포인터 사용

    2. 정수 5개로 이루어진 배열의 총합, 평균을 계산하는 프로그램을 작성하시오.

    - 함수 포인터를 선언해 연산을 수행할 각각의 함수를 호출할것

    - 평균과 합 모두 실수형으로 반환할 것

    - call by value 로 접근할 것 (원본 값 변경X)

    /*다음과 같이 함수 포인터를 선언하고, 함수의 주소를 포인터로 넘기시오 */
    float (*p)(int *); 
    p = sum; //함수의 이름(함수의 주소)를 포인터에 넘김
    total = p(arr); //배열명(배열의 주소)를 넘김

     

    <답안>

    #include <stdio.h>
    #define N 5
    
    //함수 선언
    float sum(int *q);
    float avr(int *q);
    
    //p를 사용해서 함수 호출 - 값에 의한 참조
    int main(void) {
    	int arr[N] = { 11, 12, 13, 14, 15 };
    	float average, total;
    
    	float(*p)(int*); //정수형을 받아 실수형을 반환하는 함수를 참조하는 포인터 선언
    
    	//참조, 호출
    	p = sum;
    	total = p(arr); //배열명은 주소임. 배열의 첫 요소 주소를 넘긴것!
    
    	p = avr;
    	average = p(arr);
    
    	printf("sum: %.1f\tavr: %.1f\n", total, average); //탭 정렬
    	system("pause");
    	return 0;
    
    }
    
    float sum(int *q) {
    	int hap = 0;
    	for (int i = 0; i < N; i++)
    		hap += *q++;
    	return (float)hap; 
    }
    
    float avr(int* q) {
    	float av = sum(q) / (float)N;
    	return av;
    }

     

    함수 포인터 이해  

    3. 정수 5개로 이루어진 배열에 대하여, 배열의 합을 구하는 프로그램을 작성하시오.

    - 배열의 합을 구하는 함수 int sum(int *arr, int n)을 정의할것 (배열과 그 크기를 넘김)

    - 함수 포인터를 선언해 sum 함수를 호출할 것 

    - 결과를 "합계: 150" 형식으로 출력할 것

     

    <답안>

    #include <stdio.h>
    #define N 5
    
    //함수 선언 - 배열과 그 크기를 받음 
    int sum(int* arr, int n) {
    	//배열의 총합을 계산해 반환함
    	int s = 0;
    	for (int i = 0; i < N; i++)
    		s += arr[i];
    	return s;
    }
    
    int main(void) {
    	int arr[N] = { 10, 20, 30, 40, 50 };
    	int result = 0; 
    
    	int (*p)(int*, int); //함수 포인터 선언
    	p = sum; //sum 함수 참조
    	result = p(arr, N); //함수 호출
    
    	printf("합계: %d\n", result);
    	system("pause");
    	return 0;
    
    }

     

    함수 포인터 활용

    4. 5개의 정수를 저장하는 배열에 대하여 배열의 합을 구하시오.

    - 포인터를 사용하여 배열의 합을 계산하는 함수 int sum(int *q) 를 정의할것 (포인터 연산 수행)

    - 함수 포인터를 선언하고, sum 함수를 호출할 것

    - 결과를 "합계: 15" 형식으로 출력할것

     

    <답안>

    #include <stdio.h>
    #define N 5
    
    //함수 선언 - 배열과 그 크기를 받음 
    int sum (int *q) {
    int s = 0;
    for (int i = 0; i < N; i++)
    s += *q++;
    return s;
    }
    
    int main(void) {
    int arr[N] = { 10, 20, 30, 40, 50 };
    int result = 0; 
    
    int (*p)(int*); //함수 포인터 선언
    p = sum; //실제 참조 - 포인터에 함수의 주소 대입
    result = p(arr); //호출 - 포인터에 배열의 주소 대입
    
    
    printf("합계: %d\n", result);
    system("pause");
    return 0;
    
    }

     

    포인터 증감 연산 + 포인터 활용

    5. 배열 int arr[5] = {5, 9, 2, 7, 3} 에 대하여 다음 조건을 만족하는 프로그램을 작성하시오.

    - 포인터를 인수로 받아 배열의 합(정수), 평균(실수), 최솟값 (정수) , 최댓값(정수)을 구하는 함수를 각각 정의할 것 

    - 함수 내에서 포인터 연산을 사용할 것

    - 함수 포인터를 선언해 위 함수를 호출할 것

    - 결과는 다음 형식으로 출력할 것

    합계: 26
    평균: 5.2
    최솟값: 2
    최댓값: 9

     

     

    <답안>

    #include <stdio.h>
    #define N 5
    
    int sum(int *p) {
        int s = 0;
        for (int i = 0; i < N; i++)
            s += *p++;
        return s;
    }
    
    float avr(int *p) {
        int s = 0;
        for (int i = 0; i < N; i++)
            s += *p++;
        return (float)s / N;
    }
    
    int min(int *p) {
        int m = *p++;
        for (int i = 1; i < N; i++) {
            if (*p < m)
                m = *p;
            p++;
        }
        return m;
    }
    
    int max(int *p) {
        int m = *p++;
        for (int i = 1; i < N; i++) {
            if (*p > m)
                m = *p;
            p++;
        }
        return m;
    }
    
    int main() {
        int arr[N] = {5, 9, 2, 7, 3};
    
        int (*fp1)(int *) = sum;
        float (*fp2)(int *) = avr;
    
        printf("합계: %d\n", fp1(arr));
        printf("평균: %.1f\n", fp2(arr));
        printf("최솟값: %d\n", min(arr));
        printf("최댓값: %d\n", max(arr));
    
        return 0;
    }

     

     

    예제는 교재에서 가져오거나 유사하게 응용하였습니다.

    댓글