easy software

C언어 포인터를 이용하여 Max/Min(최댓값/최솟값) 구하기 본문

C언어/포인터와 배열

C언어 포인터를 이용하여 Max/Min(최댓값/최솟값) 구하기

JAVA 웹개발자 2015. 1. 27. 15:56

안녕하세요. 이번 시간에는 포인터와 배열을 이용하여 사용자로부터 정수를 입력받고,

 

그 중에서 최댓값과 최솟값을 출력하는 예제를 해보려 합니다.

 

다만, 이번에는 더블(이중)포인터의 개념도 들어갑니다.

 

간단히 더블포인터란 무엇인지부터 살펴보도록 하죠.

 

int a = 10;

int *ptr = &a;

 

아주 간단한 포인터 연산입니다.

 

ptr이라는 int형 포인터 변수에 num의 주소값을 줘서 가리키게 하는 연산이죠.

 

 

 

 

ptr도 변수이기 때문에 주소가 있겠죠?

 

ptr은 * 연산자가 한개있는 싱글 포인터 변수이기 때문에, 이 포인터를 가리키게 하려면

 

* 연산자가 두개있는 더블 포인터 변수를 선언해야 합니다.

 

int **ptr2 = &ptr;

 

이렇게 하면 아래와 같은 그림처럼 ptr2가 ptr을 가리키고, ptr이 a를 가리키는 형식이 취해집니다.

 

 

 

 

더블 포인터를 사용하는 방법은 이게 다입니다.

 

만약, 위와 같은 그림이 머릿속에 그려지지 않는다면

 

싱글 포인터 공부를 다시 한번 더 복습하시기 바랍니다.

 

그럼 문제를 보여드리도록 하겠습니다.

 

1. 두개의 싱글 포인터 변수와, 길이가 5인 배열을 생성한다(int형)

 

2. 사용자로부터 정수5개를 입력받는다.

 

3. MaxMin이라는 함수로 포인터와, 배열을 전달한다.

 

4. MaxMin함수에서 각각의 포인터가 배열의 최댓값과 최솟값을 가리키도록 한다.

 

5. main에서 두 포인터의 값이 변경되었는지 확인하기 위해 출력한다.

 

먼저, 그림을 그려보면서 코드를 작성해보시기 바랍니다.

 

그림을 그리면서 포인터를 이해하면 그냥 이해하는 것보다

 

훨씬 더 수월하게 포인터를 이해할 수 있습니다.

 

 

#include <stdio.h>

 

//최대값과 최솟값을 찾아주는 함수

//main의 max,min이 싱글포인터이므로, 그 주소를 받으려면 더블 포인터 선언 필요
void MaxMin(int **pMax, int **pMin, int *ar, int size){

     int *m = 0, *n = 0;

     m = n = ar;//m과 n이 ar을 가리키게 함

 

for (int i = 0; i < size; i++){
      //*m과 *n은 처음에 배열의 첫번째 인덱스를 가리키고 있음
      //가장 처음에 가리키고 있는 인덱스보다 다른 인덱스의 값이
      //크거나 작으면 m과n값에 그 배열의 주소값을 줘서 가리키게 함
      if (*m < ar[i])
           m = &ar[i];

  

if (*n>ar[i])
       n = &ar[i];

}

 

     //pMax는 main의 max를, pMin은 main의 min을 가리키고 있음
     //max에는 m, min에는 n을 가리키게 함으로써 main의 포인터 변수를 변경함
     *pMax = m;
     *pMin = n;
}

 

int main(void){

     int arr[5];
     int *max = 0, *min = 0;

 

printf("배열에 저장할 정수 5개를 입력하세요 : ");

 

//사용자가 입력한 정수를 arr에 저장
 for (int i = 0; i < 5; i++)
      scanf_s("%d", &arr[i]);

 

MaxMin(&max, &min, arr, sizeof(arr) / sizeof(int));

     printf("최댓값 : %d \n", *max);
     printf("최솟값 : %d \n", *min);

 

return 0;
}

Comments