카메라 개발자 공부방(SW)

[12장] 포인터와 배열 본문

Langauge/C

[12장] 포인터와 배열

luckmart 2021. 10. 1. 14:40
반응형

자 오늘은 포인터와 배열의 예제 코드를 작성해보는 시간을 가져보겠습니다.

#include <stdio.h>

int main()
{
    int arr[4] = {1, 2, 3, 4};
    int* parr = arr;

    for (int k = 0; k < 4; k++)
        printf("%d ", parr[k]);
    return 0;
}

// 실행 결과
// 1 2 3 4

배열의 이름은 첫 번째 요소의 주소입니다. 

(익숙하지 않으시다면 9-10장을 꼭 복습해주세요.)

parr(포인터 변수)에 arr의 주소를 저장해서 모든 원소를 출력하였습니다. 

#include <stdio.h>

int main()
{
    int arr[4] = {1, 2, 3, 4};
    int* parr = &arr[2];

    printf("%d %d\n", parr[1], *arr);
    return 0;
}

// 실행결과
// 4 1

 

parr의 주소엔 arr[2]의 주소가 저장되어있습니다.

[]연산은 왼쪽 주소 값을 기준으로 번지를 이동하기 때문에 parr[1]은 그 다음 번 지점의 주소를 의미합니다. 그러므로 4가 출력됩니다.

#include <stdio.h>

void PrintArray(int*parr, int size)
{
    int k = 0;
    for (k = 0; k < size; k++)
        printf("%d ", parr[k]);
}

int main()
{
    int arr[4] = {1, 2, 3, 4};
    PrintArray(arr, 4);
    return 0;
}

실행결과
// 1 2 3 4

printArray라는 함수의 매개변수 parr에 main 함수의  arr의 주소가 복사되고,

모든 요소를 출력한 예제입니다.

#include <stdio.h>

void MultiplyArray(int* parr, int size)
{
    for (int k = 0; k < size; k++)
        parr[k] *= 2;
}

void PrintArray(int* parr, int size)
{
    for (int k = 0; k < size; k++)
        printf("%d ", parr[k]);
}

int main()
{
    int arr[4] = {1, 2, 3, 4};
    PrintArray(arr, 4);
    MultiplyArray(arr, 4);
    PrintArray(arr, 4);
    return 0;
}

// 실행결과
// 1 2 3 4
// 2 4 6 8

MultiplyArray라는 함수의 parr 포인터 변수에 main 함수의  arr의 주소가 복사되었습니다.

MultiplyArray란 함수에선 main 함수의 arr 메모리에 직접 접근할 수 있습니다.

위의 코드는 단순히 메모리 값에 × 2를 하고 모든 요소를 출력하였습니다.

#include <stdio.h>             // 1 line
void Swap(int n1, int n2)      // 2
{                              // 3
   int tmp = n1;               // 4
   n1 = n2;                    // 5
   n2 = tmp;                   // 6
}                              // 7
                               // 8
int main()                     // 9
{                              // 10
    int n1 = 2;                // 11
    int n2 = 4;                // 12
    printf("%d %d\n", n1, n2); // 13
    Swap(n1, n2);              // 14
    printf("%d %d\n", n1, n2); // 15
                               // 16
    return 0;                  // 17
}                              // 18

// 실행결과
// 2 4
// 2 4

 

위의 예제 코드는 변수의 메모리를 서로 값을 교환해주는 Swap함수에 대한 코드입니다.
그런데 왜 14라인에서 Swap 함수를 호출 전후의 결과가 같을까요?

Swap과 main 메모리

14라인에서 n1, n2의 값이 2라인의 Swap의 매개변수 n1, n2의 메모리 공간에 복사가 되었습니다.

2 ~ 6라인의 Swap 코드에 의해 1라인의 매개변수 값이 서로 교환이 되었지만, main 함수의 n1, n2의 메모리 값을 서로 교환시킨 것이 아니라 Swap 함수의 매개변수끼리 서로 교환시켰기 때문에 실행결과가 동일한 것입니다.

#include <stdio.h>             // 1 line
void Swap(int* pn1, int* pn2)  // 2
{                              // 3
   int tmp = *pn1;             // 4
   *pn1 = *pn2;                // 5
   *pn2 = tmp;                 // 6
}                              // 7
                               // 8
int main()                     // 9
{                              // 10
    int n1 = 2;                // 11
    int n2 = 4;                // 12
    printf("%d %d\n", n1, n2); // 13
    Swap(&n1, &n2);            // 14
    printf("%d %d\n", n1, n2); // 15
                               // 16
    return 0;                  // 17
}                              // 18

// 실행결과
// 2 4
// 4 2

Swap에서 main의  n1, n2 메모리 공간 자체의 값을 교환하려면 Swap 함수에서 main 함수의 변수 메모리 n1과 n2의 주소를 반드시 알고 있어야 합니다. 그러므로 의도한 데로 구현하려면 포인터를 사용해야합니다.

 

자 오늘은 여기까지~ 

'Langauge > C' 카테고리의 다른 글

[14장] 배열과 문자열  (0) 2021.10.03
[13장] 포인터의 포인터(pointer of pointer)  (0) 2021.10.02
[11장] 배열  (0) 2021.09.30
[10장] 포인터  (0) 2021.09.29
[9장] 변수와 주소  (0) 2021.09.28
Comments