혼종은 아니다. 응용이다. 1차원 배열과 다차원 배열에서 포인터가 어떻게 활용되는지 조금만... 아주 조금만 더 알아보도록 하자. 더 이상 알아보면 자료구조에 질릴 수도 있겠다는 생각을 한다.
일반적인 배열 표기, 포인터로 배열 포기
1차원 배열의 간단한 인덱스를 보자
#include <stdio.h>
int main(void)
{
int ary[4] = {1, 2, 3, 4};
int i;
for ( i=0; i<4; i++ )
printf("%d", ary[i]);
return 0;
}
여기서 결과값은 1234라는 것을 알 수 있다.
그렇다면 이와 똑같은 값을 도출해내기 위해 포인터 i로는 어떻게 코딩해야할까?
#include <stdio.h>
int main(void){
int ary[4] = {1, 2, 3, 4};
int i;
for ( i=0; i<4; i++ )
printf("%d", *(ary+i));
return 0;
}
참쉽쥬? 포인터 i가 +1 될 때마다 배열 내 다음 원소를 참조하므로 간단하기 그지없다.
그렇다면 2차원 배열의 인덱스는 어떻게 접근해야할까?
#include <stdio.h>
int main(void){
int ary[2][2] = { {1, 2}, {3, 4} };
int i, j;
for ( i=0; i<2; i++ ) {
for ( j=0; j<2; j++ )
printf("%d", ary[i][j]);
printf("\n");
}
return 0;
}
12
34
이런 식으로 답이 나온다는 것을 직관적으로 알 수 있다.
이 것을 포인터를 이용해 표현하면
#include <stdio.h>
int main(void){
int ary[2][2] = { {1, 2}, {3, 4} };
int i, j;
for ( i=0; i<2; i++ ) {
for ( j=0; j<2; j++ )
printf("%d", *(*(ary+i)+j));
printf("\n");
}
return 0;
}
위와 같은 12,34 결과가 나온다.
먼저 ary 몇 번째 행인지(i), 그 행의 주소값을 빼내고(값을 바로 빼내는 것이 아니다) 그 주소값에서의 열 j에 접근하는 것이다. 언뜻보면 이중 포인터처럼 보일 수 있지만 배열이기에 의미는 다르다고 볼 수 있다.
이런 식으로 *(*ary+3)+3) --> ary[4,4] 요래요래 나타낼 수 있다.
배열을 인수로 사용
배열을 인수로 사용할 수 있다.
아무튼 있다.
특히 배열의 포인터, 즉 주소를 넘겨 받고자 할 때 알 수 있다.
다음의 식을 보자.
#include <stdio.h>
int ary_prn(int *ap);
int main(void) {
int ary[3] = {1, 2, 3};
ary_prn(ary); // 배열을 인수로 사용함, 배열 주소를 넘겨줌
return 0;
}
int ary_prn(int *ap) { // 포인터로 받음
int i;
for ( i=0; i<3; i++ ) {
printf("%5d", *(ap+i));
}
printf("\n");
return 0;
}
여기서 ary_prn함수는 ap라는 포인터를 변수로 삼는다. 따라서 main에서도 포인터로 배열을 넘겨주고 출력도 포인터로 받는다.
이제 배열 포인터를 인수로 사용하는 경우를 살펴보자. 봐야한다.
#include <stdio.h>
int ary_prn(int (*ap)[4]);
int main(void) {
int ary[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
ary_prn(ary); // 2차원 배열을 인수로 사용함, 배열 주소를 넘겨줌
return 0;
}
int ary_prn(int (*ap)[4]) { // 포인터로 받음
int i, j;
for ( i=0; i<3; i++ ) {
for (j=0; j<4; j++){
printf("%5d", *(*(ap+i)+j));
}
printf("\n");
}
return 0;
}
여기서 ary_prn 함수는 (*ap)[4] 즉 4개의 열을 가지는 ap배열 포인터를 사용하고 있다.
따라서 이중 for 문 안에 *(ap+i)로 먼저 목표 행 뽑아내주고 j번째 열에서 목표 숫자를 꺼내는 함수를 수행하고 있다.
배열과 포인터에 대해서 애매모호하게 짚고 나가면 나중에 크게 헷갈리는 경우가 많다. 내가 그렇다. 그러니 조금 난해하더라도 확실하게 이해하고 넘어가길 추천!!!!한다.
'Data Structure [C] > 문돌이도 할 수 있는 [C언어 자료구조]' 카테고리의 다른 글
#15 [C 자료구조] 포인터와 구조체 (0) | 2019.04.20 |
---|---|
#14 [C 자료구조] 구조체: 다른 타입들의 배열 (0) | 2019.04.20 |
#12 [C 자료구조] 2차원 배열: 행렬이 된 배열 (0) | 2019.04.19 |
#11 [C 자료구조] 이중 포인터: 나를 가르키는 너를 가르키는 타인 (0) | 2019.04.19 |
#10 [C 자료구조] 포인터가 뭐죠?: 자료의 저장 방법 (0) | 2019.04.19 |