Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-17 00:00
관리 메뉴

nomad-programmer

[Programming/C] 다차원 배열 주소의 의미 본문

Programming/C

[Programming/C] 다차원 배열 주소의 의미

scii 2020. 6. 22. 00:12

c_arr 변수의 메모리 주소가 12ff7c 라고 가정한다.

#include <stdio.h>

void main() {
    char c_arr[2][2] = {'A', 'B', 'C', 'D'};
    
    printf("%x %x %x %x\n",
        &c_arr[0][0], c_arr, c_arr[0], c_arr[1]);
    
    printf("%x %x %x %x\n",
        &c_arr[0][0]+1, c_arr+1, c_arr[0]+1, c_arr[1]+1);
}

// 결과
/*

12ff7c 12ff7c 12ff7c 12ff7e
12ff7d 12ff7e 12ff7d 12ff7f

*/

&c_arr[0][0]는 char형 1바이트의 주소를 의미하며 여기에 +1을 한 것은 1바이트의 주소를 덧셈하라는 의미이다.
c_arr은 char형 배열 2*2의 시작 주소를 의미하며 +1을 한 것은 열의 바이트수인 2바이트(char형 2개[2])의 주소를 건너뛰라는 의미이다.
c_arr[0]는 0행의 시작 주소를 의미하며 1차원 char형 주소의 의미로 +1을 한 것은 char형 1바이트의 주소를 건너뛰라는 의미이다.
또 c_arr은 char형 2차원 배열이므로 char형의 2차원 의미를 갖고 c_arr[0], c_arr[1], &c_arr[0][0]는 1차원의 의미를 갖는다.

각 주소는 * 연산를 붙여 값에 접근하거나 차원을 한 단계 낮추는 데 사용한다.
예를 들어 1차원 주소에 *연산자를 붙이면 값이 되지만 2차원 주소에 *연산자를 붙이면 1차원 주소가 되고, 3차원 주소에 *연산자를 붙이면 2차원 주소가 된다.

#include <stdio.h>

void main() {
    char c_arr[2][2] = {'A', 'B', 'C', 'D'};
    
    printf("%x %x %x %x\n", c_arr, *c_arr, **c_arr);
    
    printf("%x %x %x %x\n", c_arr, c_arr[0], c_arr[0][0]);
}

// 결과
/*

12ff7c 12ff7c 41
12ff7c 12ff7c 41

*/

두 문장의 코드는 같다. c_arr은 2차원 주소 12ff7c를, *c_arr은 1차원 주소 12ff7c를, **c_arr은 메모리 자체(문자 'A')를 의미한다.
*c_arr은 1차원 주소를 의미하는데, c_arr이 2차원 주소이므로 * 연산자를 붙여 1차원 주소가 된다. 또 **c_arr은 char형 1바이트를 의미하는데, *c_arr이 1차원 char형 주소를 의미하기 때문이다.

 

3차원 배열

#include <stdio.h>

int main() {
    char c_arr[2][2][3] = {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'
    };

    printf("%x %x %x %x\n",
        c_arr, c_arr[0], c_arr[0][0], c_arr[0][0][0]);

    printf("%x %x %x %x\n",
        c_arr + 1, c_arr[0] + 1, c_arr[0][0] + 1, c_arr[0][0][0] + 1);

    printf("%x %x %x %x\n",
        c_arr + 1, *c_arr + 1, **c_arr + 1, ***c_arr + 1);

    return 0;
}

// 결과
/*

ddfb70 ddfb70 ddfb70 41
ddfb76 ddfb73 ddfb71 42
ddfb76 ddfb73 ddfb71 42

*/

c_arr은 3차원 char형 배열의 시작 주소이다. +1은 행X열([2][3], 6바이트)을 증가시킨 주소가 된다.
c_arr[0]에 +1을 한 것은 열([3], 3바이트)을 증가시킨 주소가 된다.
c_arr[0][0]에 +1을 한 것은 char형 1바이트를 증가시킨 주소가 된다.
c_arr[0][0][0]는 문자 'A' (0x41)에 1을 증가시켜 문자 'B' (0x42)가 된다.

Comments