본문 바로가기
C 언어

c 언어[030] 2차원 배열 크기 sizeof 에 대한 이해 &arr[0], &arr[0[0],&arr 주소값의 이해

by Smart Factory in 2020 2021. 10. 11.
728x90
반응형

안녕하세요. 스마트팩토리입니다. 
c 언어[030] 2차원 배열 크기 sizeof  에 대한 이해    &arr[0], &arr[0[0],&arr 주소값의 이해에 대해 알아보겠습니다



1. 2차원 배열의 크기와 주소값

가. 2차원 숫자 배열 출력

- 메모리에 저장된 2차원 배열을 출력
- for 반복문을 활용
- 형식지정자 및 줄바꿈, 칸 뛰기 활용

int arr[2][3] = { {10,20,30},{40,50,60}};

이차원 배열 arr 2행 3열로 인덱스 번호는 0부터 시작함을 알고 출력값을 이해할 수 있습니다.

printf("arr[1][2]: %d\n", arr[1][2]); 값은  60으로 인덱스 번호의 1행 2열의 요소를 출력합니다. 

#include<stdio.h>
void main() {
int arr[2][3] = { {10,20,30},{40,50,60}};

for (int i = 0; i <2; i++) {
for (int j = 0; j <3; j++) {
printf(" %d", arr[i][j]);
}
}
printf("\n");
for (int i = 0; i <2; i++) {
for (int j = 0; j <3; j++) {
printf("\t %d", arr[i][j]);
}
printf("\n");
}

printf("arr[1][2]: %d\n", arr[1][2]);
}

 

나. 2차원 배열 크기 (sizeof)

int arr[2][3] = { {10,20,30},{40,50,60}};

이차원 배열의 요소는 행과 열로 구분하면 총 요소는 6개입니다. 인덱스 하다 크기는 int 형 으로 4바이트 입니다. 

arr[2][3] 으로 구성된 배열 arr 는 총 24 바이트입니다.

arr[0] 으로 하여  그 크기를 출력해 보면 이는 한 행의 요소 전체의 크기를 의미합니다. 즉 2행 3열로 되어 있기 때문에 한 행은 3개의 요소로 구성되어 있어서 12 바이트 입니다. 

arr[0][0]은 0행 0열 요소 하나의 크기를 의미합니다. 그래서 4바이트가 나옵니다.

이차원 배열에서는 행전체를 의미하는 것인지 개별 행을 의미하는지 확실히 이해해야 합니다. 

#include<stdio.h>
void main() {
int arr[2][3] = { {10,20,30},{40,50,60}};
for (int i = 0; i <2; i++) {
for (int j = 0; j <3; j++) {
printf("\t %d", arr[i][j]);
}
printf("\n");
}
printf("이차원 배열 arr의 크기 : %d \n",sizeof(arr));
printf("이차원 배열 arr[0]의 크기 : %d \n",sizeof(arr[0]));
printf("이차원 배열 arr[0][0]의 크기 : %d \n",sizeof(arr[0][0]));
}

다. 2차원 배열  주소값

printf("이차원 배열 arr 주소 : %d \n", &arr);

- arr 주소 값 즉 arr[0][0]의 주소값 인 &arr[0][0] 값과 같습니다. 
이는 1차원 배열일때 첫번째 인덱스 0행 0열 요소의 주소값과 해당 배열의 주소값이 같은 것과 같은 이치입니다. 


printf("이차원 배열 arr[0]  주소 : %d \n", &arr);

arr[0]은 첫번째 행의 주소값 을 의미합니다. 결과적으로 이 값도 배열의 주소값과 동일합니다.

printf("이차원 배열 arr[0][0] 주소 : %d \n", &arr[0][0]);

배열의 주소값과 동일한 값이란 것을 알 수 있습니다. 

#include<stdio.h>
void main() {
int arr[2][3] = { {10,20,30},{40,50,60} };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("\t %d", arr[i][j]);
}
printf("\n");
}
printf("이차원 배열 arr 주소 : %d \n", &arr);
printf("이차원 배열 arr[0]  주소 : %d \n", &arr);
printf("이차원 배열 arr[0][0] 주소 : %d \n", &arr[0][0]);
printf("\n");
printf("이차원 배열 arr 주소 : %x \n", &arr);
printf("이차원 배열 arr[0]  주소 : %x \n", &arr);
printf("이차원 배열 arr[0][0] 주소 : %x\n", &arr[0][0]);
}

printf("이차원 배열 arr[0][0] 주소 : %d \n", &arr[0][0]);
printf("이차원 배열 arr[1][0] 주소 : %d \n", &arr[1][0]);

두 배열의 주소값의 차이를 보면 행의 요소의 갯수만큼 차이가 나는 것을 알 수 있습니다 


인덱스=주소값으로 확인해 보면

arr[0][0]=9436624
arr[0][1]=9436628
arr[0][2]=9436632

arr[1][0[=9436636

4바이트 크기로 순차 진행되는 것을 알 수 있습니다. 

728x90
반응형

댓글