프로그래밍

 3198, 1/160 회원가입  로그인  
   capt_0669
   [C언어] 잘 안되서 카피잉 하다가 이해할려고 노력中

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2876 [복사]


#include <stdio.h>

void F_max_min (int *arr, int size, int **mx, int **mn);

int main()
{
        int arr[5];
        int i;
        int *max, *min;

        for(i=0;i<5;i++)
        {
                printf("5개의 정수를 입력하시오: ");
                scanf("%d", &arr[i]);
        }

        F_max_min (arr, sizeof(arr)/sizeof(int), &max, &min);
        printf("최대: %d, 최소: %d \n", *max, *min);
        return 0;
}

void F_max_min (int *arr, int size, int **mx, int **mn)
{
        int i;
        int *max, *min;

        max=min=arr;
        for(i=0; i<size; i++)
        {
                if(*max<arr[i])
                        max=&arr[i];
                if(*min>arr[i])
                        min=&arr[i];
        }
        
        *mx=max;
        *mn=min;
}


이 코드가 Call-By-Reference 랑 Double pointer를 이용해서 max와 min을 구하는것인데요
Function쪽을 보시면
max=min=arr 이있잖아요
여기서 그다음 줄에 있는 *max와 *min들이 저장되는데요

만약 숫자를 (17,19,25,6,7)하면
arr[i]중에서 arr의 값은 i가 변해도 주소는 바뀌지 않는데
왜 그 주소가 예를 들어 0x0030fa00이라면 왜 저 주소가 첫번째 값의 주소를 가르키는거죠?

그림을 그려보면
-------------- 17의 주소
--------------
--------------
--------------
--------------

--------------19의 주소
--------------
--------------
--------------
--------------

--------------25의 주소
--------------
--------------
--------------
--------------

--------------6의 주소
--------------
--------------
--------------
--------------

--------------5의 주소
--------------
--------------
--------------
--------------

여서 즉 arr의 주소는 첫번째 칸의 주소이니깐 그런것인가요?

둘째질문은
맨 밑에
*mx=max;
*mn=min;
들은 왜 붙은 것입니까?

  Hit : 4683     Date : 2011/02/02 01:32



    
capt_0669 *mx=max;
*mn=min;
을 주석 처리하니깐 또 작동이 안되네요
2011/02/02  
effortkim *mx=max;
*mn=min;
은 max와 min이 가리키는 주소를 *mx와 *mn도 가리키기 위함입니다.
즉, mx와 mn은 더블포인터로서, main함수의 포인터의 값을 바꾸기 위해 전달받았습니다.
이 포인터의 값은 주소값이고, 이 주소값을 넣어 준 것입니다.
2011/02/06  
effortkim 이 코더의 의도는 다음과 같습니다.

1. main함수에서 max와 min이 arr의 최댓값과 최솟값을 가리키도록 한다.
2. 이 작업을 F_max_min이라는 함수에서 한다.

그렇다면, main에서 max와 min의 값은 어떤 주소를 가리켜야 하겠죠?(정확히는 int형 공간 주소입니다.) 즉, max와 min의 값은 주소값이 되겠습니다. max와 min의 값을 바꾸기 위해서는 max와 min을 가리킬 수 있는 자료형인 이중포인터로 넘겨주어야 합니다. 그렇기 때문에 이중포인터를 쓴 것이구요.
작업을 한 후에 최종적으로 F_max_min에서 max와 min은 자료의 최댓값과 최솟값을 각각 가리킬 것입니다. 이를 전달받은 포인터의 포인터(이중포인터)가 가리키는 곳(포인터)에 최댓값과 최솟값의 주소를 저장하는 것입니다. 그렇기 때문에 *mx=max; *mn=min;이 붙는 것입니다.

1번의 답은 질문자께서 말씀하신대로 배열의 이름은 그것의 첫 요소(인덱스 번호 0번의 메모리 번지)를 가리킵니다. 그리고 질문자께서 그리신대로 배열을 할당받으면 연속적인 공간에 할당받습니다.
2011/02/06