본문 바로가기

Data Structure [C]/문돌이도 할 수 있는 [C언어 자료구조]

#13 [C 자료구조] 배열과 포인터의 혼종

혼종은 아니다. 응용이다. 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번째 열에서 목표 숫자를 꺼내는 함수를 수행하고 있다.

 


 

배열과 포인터에 대해서 애매모호하게 짚고 나가면 나중에 크게 헷갈리는 경우가 많다. 내가 그렇다. 그러니 조금 난해하더라도 확실하게 이해하고 넘어가길 추천!!!!한다.