삽질의 현장/- C

곱씹어보자 C!_#016_삽잡이의 두서없이 막하는 배열 포인터

shovelman 2015. 6. 26. 23:59


1
2
3
4
int arr[3= {423}; 
int* p;
 
= arr;
cs


위와 같이 선언하고 정의를 하여 

포인터 변수를 arr 배열과 같이 사용할 수 있습니다.


하지만 중요한 것은 arr[0]와 p[0]이 같으려면 포인터 변수인 p는 

int형 주소를 담는 int* 형이어야 한다는 것입니다.

int 형 메모리를 int* 형 포인터는 다 접근할 수 있다 이겁니다.


그렇다면 2차원 배열을 생각해보도록 하겠습니다.


1
2
3
4
5
int arr[2][3= {1,2,34,5,6};
int* p;
 
= arr;
 
cs


2차원 배열도 뭐 까지꺼 똑같이 선언하면 되지 않겠습니까?

아닙니다. 해보세요...

왜 안되거나 warning을 발생시킬까요? 형태가 달라서 그렇습니다.


int 형 일차원 배열에서는 int* 형태의 포인터변수가 짝꿍이 었습니다.

하지만 이차원 배열에서는 다릅니다. 


지난 시간에 말씀드린 것을 토대로 말씀드리자면,

int arr[2][3]이라는 이차원 배열명 arr은 

&a[0]의 주소라고 말씀 드렸습니다. 


그러니까 arr은 2덩어리의 데이터를 가지고 있다는 것이고,

arr[0]과 arr[1]은 각각 3개의 int형 배열을 가지고 있는 것이죠.


그렇다는 것은, 

int형 변수 3개길이의 배열을 가지고 있으므로 arr[0]은 각각 그 3개의 배열들의 이름이 되죠...


머리아프신가요? 

제가 좀 말을 못하는거 같네요... 원래 잘하는데 푸하하...


아니... 그러니까 제말은


int arr[3] 이라는 배열이 있다면, 

이 arr 배열이라는 놈의 안에는 int 3개 짜리 배열이 들어있죠? 

바꿔 말하자면 int 3개짜리 배열의 이름은 arr 이죠....


별거 없습니다. 여러분. 2차원 배열도 같습니다.


int arr[2][3] 이라는 2차원 배열에는 

각각 arr[0]과 arr[1]이라는 놈들이 있는 것이구요

그 놈들은 각각 int 3개짜리의 배열을 가지고 있습니다.

그렇다는것은!!! int 3개짜리의 배열의 이름은 arr[0]과 arr[1]이라고 할 수 있다는 것입니다!!

그말인 즉! 

int형 3개 짜리의 배열의 주소는 &arr[0], &arr[1]이 된다는 것이군요!


arr[0]에는 3개짜리의 배열 즉, int [3]이 있지 않습니까?

또 그것들을 가지고 있는 것이 arr이구요...


그러니 즉, 2차원 배열 포인터를 감당하기 위해서는 

2차원 배열처럼 동작하는 포인터가 필요합니다.


1차원 배열에서도 맞춰줬듯이 2차원 배열에서도 맞춰줘야 

2차원 배열처럼 동작하는 포인터가 완성이 되겠죠.

그러니까~ 2차원 배열처럼 움직이는 것이 같아야된다 이거죠!


이런 int  형식 2차원 배열처럼 동작하는 포인터를 바로 2차원 배열 포인터라고 합니다.


하... 길게 왔네요...

아무튼... 그 포인터를 만들기 위해서는,

1차원 배열 포인터와 같지만 다른 한가지가 있습니다. 바로 열의 개수를 써야되는 것입니다.


1
2
3
4
int arr[2][3];
int(*pa)[2];
 
pa = arr;
cs


이렇게 말입니다... 어때요... 하하하...

어려우면서도 재밌네요...