easy software

C언어 다차원 배열과 포인터의 이해1 본문

C언어/포인터와 배열

C언어 다차원 배열과 포인터의 이해1

JAVA 웹개발자 2015. 1. 27. 20:11

안녕하세요. 이번 시간에는 이론 위주로 글을 작성하려 합니다.

 

포인터의 막바지라고 말씀드릴 수 있겠네요.

 

너무 장황하게 설명드리지 않고, 요점만 딱딱 찝어서 글을 작성하겠습니다.

 

 

2차원 배열 int a[3][2]; 선언

 

int a[3][2] = {1, 2, 3, 4, 5, 6};

 

printf("a[0] : %d \n", a[0]);

printf("a[1] : %d \n", a[1]);

printf("a[2] : %d \n", a[2]);

 

printf("a     : %d \n", a);

 

 

위의 코드를 실행하면 어떤 값이 출력될까요?

 

a[0] ~ a[2]까지는 8바이트씩 차이나는 주소값이 출력됩니다.

 

그리고 a[0]와 a의 값은 같습니다.

 

즉 a[0]은 a[0][0] 을 가리키고,

 

a[1]은 a[1][0]을 가리키게 됩니다.

 

그리고 a는 배열의 가장 앞인 a[0][0]을 가리키게 됩니다.

 

왜 8바이트씩 차이가나는 값을 출력했는지 대충 감이오시나요?

 

int형 배열이기 떄문에 4바이트, 각 a들이 가리키고있는 곳은 행의 가장 앞부분입니다.

 

즉, a[0] 다음에 a[1]을 출력하면 a[0][1]은 건너뛰게 되는것이죠. 그렇기 때문에

 

sizeof(int) * 배열 가로길이(2) = 8 이라는 값이 계산이 되는 것입니다.

 

그럼 아래의 코드는 값이 어떻게 출력될까요?

 

 

int a[3][2] = {1, 2, 3, 4, 5, 6};

 

printf("a    : %d \n", a);

printf("a+1 : %d \n", a+1);

printf("a+2 : %d \n", a+2);

 

 

위의 코드와 동일한 값이 출력되지 않나요?

 

a+1은 a[1][0]을 가리키고, a+2는 a[2][0]을 가리키게 됩니다.

 

그림으로 한눈에 파악해 보시죠.

 

 

 

그림을 보시고, 그리고 제 설명을 보셨다면 100%까지는 아니더라도,

 

어느정도 감은 잡히시리라 믿습니다.

 

그럼, 이번글의 마지막으로 간단한 질문하나를 드리겠습니다.

 

 

#include<stdio.h>

 

int main(void)
{


     int arr[3][2] = { 1, 2, 3, 4, 5, 6 };

 

     printf("arr: %d \n", sizeof(arr));

 

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

 

     return 0;
}

 

위의 값을 출력해보시면, 순서대로 24, 8, 8, 8이 출력됩니다.

 

왜 그럴까요?

 

분명히 arr과 arr[0]를 같은 개념으로 생각하시는 분들도 계실겁니다.

 

하지만, 제가 위에서 언급했듯이

 

arr[0]은 arr[0][0]이 있는 행의 가장 앞을 가리키고,

 

arr[1]은 arr[1][0]이 있는 행의 가장 앞을 가리킵니다.

 

그리고 arr자체는 그 배열 덩어리 전체의 가장 처음을 가리킵니다.

 

즉, arr[0]의 sizeof를 하게되면, arr[0]이 가리키고 있는 행 전체크기를.

 

arr[1]은 arr[1]이 가리키고 있는 행 전체 크기를,

 

arr은 본인이 가리키고있는 배열 전체의 크기를 반환하게 되는 것입니다.

 

 

오늘은 이상으로 글을 마치겠습니다.

 

다음시간에도 다차원 배열과 포인터의 이해를 도와드리겠습니다.

Comments