프로젝트 & 과제/3학년

[C언어] 2차원 배열의 주소

qqlzzb 2022. 1. 27. 14:38

개요

프로그래밍 언어 : C언어

과제 수행 날짜 : 2020.09.25

과제 개요 : 2차원 배열의 주소와 상대 주소를 정리

 

코드

#include <stdio.h>

int i[3][4] = {100, 200, 300, 400, 500, 600, };

int main()
{
    printf("%p\n", i);
    printf("%p   %p   %p\n", i+1, &i, &i + 1);
    printf("%p   %p   %p\n", i[0], i[1], i[2]);
    printf("%p   %p   %p\n", i[0] + 1, i[1] + 1, i[2] + 1);
    printf("%p   %p   %p\n", i[0] + 2, i[1] + 2, i[2] + 2);
    printf("%p   %p   %p\n", &i[0], &i[1], &i[2]);
    printf("%p   %p   %p\n", &i[0] + 1, &i[1] + 1, &i[2] + 1);
    printf("%p   %p   %p\n", &i[0][0], &i[1][0], &i[2][0]);
    printf("%p   %p   %p\n", i[0][0], i[1][0], i[2][0]);
}

 

결과

 

- 실제주소와 상대주소 ( i의 실제주소는 00AFA034, 상대주소는 0)

변수 실제주소 상대주소 변수 실제주소 상대주소 변수 실제주소 상대주소
i+1 00AFA044 16 &i 00AFA34 0 &i+1 00AFA064 48
i[0] 00AFA034 0 i[1] 00AFA044 16 i[2] 00AFA054 32
i[0]+1 00AFA038 4 i[1]+1 00AFA048 20 i[2]+1 00AFA058 36
i[0]+2 00AFA03C 8 i[1]+2 00AFA04C 24 i[2]+2 00AFA05C 40
&i[0] 00AFA034 0 &i[1] 00AFA044 16 &i[2] 00AFA054 32
&i[0]+1 00AFA044 16 &i[1]+1 00AFA054 32 &i[2]+1 00AFA064 48
&i[0][0] 00AFA034 0 &i[1][0] 00AFA044 16 &i[2][0] 00AFA054 32
i[0][0] 0x64 100 i[1][0] 0x1F4 500 i[2][0] 0 0

 

설명

전역변수로 만든 배열의 주소를 살펴보면, 일단 i와 &i, i[0], &i[0], &i[0][0]의 주소가 모두 같음을 알 수 있다. 하지만 i + 1을 하면 16이 증가하는 것으로 보아 다음 행을 가리키고, &i + 1을 하면 48이 증가하는 것으로 보아 다음 배열을 가리킴을 알 수 있다.(배열 전체를 건너 뜀). 또 i[0] + 1을 하면 4가 증가하므로 첫 번째 행에서 다음 요소를 가리키고, i[0] + 2를 하면 8이 증가하므로 다다음 요소를 가리킴을 알 수 있다. 또 &i[1][0]과 &i[2][0]은 각각 두 번째, 세 번째 행의 처음에 있는 int의 주소를 가리킨다. 마지막으로 i[0][0]과 같이 표현하면 배열의 해당 인덱스에 있는 값이 출력된다. i[2][0]에는 초기값을 입력하지 않았으므로 0이 출력된다. 2차원 배열에서 i[0][0]과 같은 형태로 입력하지 않으면 모두 주소 값을 가진다.