본문 바로가기

Programming Language/C

[C언어] 혼공C 예제 연습_포인터와 배열에 대해서

320x100

이번 시간에도 C언어에 대한 학습을 진행합니다.

C언어에서 다양한 자료의 형태 중 Pointer와 배열의 사용에 대해서 알아보겠습니다.

 

 배열은 int array[10]; 과 같이 변수를 선언하는 것과 똑같이 크기와 함께 선언합니다.

포인터의 경우 int *point처럼 변수 앞에 * 을 붙이면서 선언합니다.

 

이때 배열은 주소처럼 포인터에도 바로 저장할 수 있습니다. 

그렇다면 포인터로 연산식이나 대괄호를 써서 배열의 요소를 정의할 수도 있습니다.

 

#include <stdio.h>

int main(void)
{
	int ary[3];			// 배열 선언
	int* pa = ary;	  // 포인터에 배열명 저장
	int i;			// 반복 제어 변수

	*pa = 10;	 // 첫 번째 배열 요소에 10 대입
	*(pa + 1) = 20; // 두 번째 배열 요소에 20 대입
	pa[2] = pa[0] + pa[1]; // 대괄호를 써서 pa를 배열명처럼 사용

	for (i = 0; i < 3; i++)
	{
		printf("%5d", pa[i]); // 포인터로 모든 배열 요소 출력
	}

	return 0;
}

 

이 경우 포인터 pa로 배열 요소를 사용할 수 있습니다.

 

배열명과 포인터는 쓰임새는 같다고 봐야 하지만 뜯어보면 몇가지가 다릅니다.

 

1) 저장된 크기가 다릅니다.

 

sizeof()를 통해 크기를 구하면, 배열과 포인터의 크기는 상이한데요.

sizeof(array)는 배열 전체의 크기를 보여주지만 sizeof(pa)는 포인터 단 하나의 크기를 확인합니다.

 

2) 변수와 상수의 차이가 있습니다.

 

포인터는 값을 바꿀 수 있지만 배열명은 값을 바꿀 수 없습니다.(상수)

아래를 보겠습니다.

 

pa = pa +1
pa++  // 가능

 

이 사용은 가능합니다.

 

array = ary +1
ary ++

 

하지만 배열의 경우에는 이러한 연산으로 사용은 불가능합니다.


 

포인터를 사용해서 연산을 하는 것도 가능합니다.

배열을 선언하고, 포인터를 사용해서 뺄셈 연산과 대소비교를 진행해보았습니다.

 

#include <stdio.h>

int main(void)
{
	int ary[5] = { 10, 20, 30, 40, 50 };
	int* pa = ary;	// 첫번째 배열 요소 주소
	int* pb = pa + 3;	// 네번째 배열 요소 주소

	printf("pa : %u\n", pa); // 주소 배출
	printf("pb : %u\n", pb);

	pa++;			// pa를 다음 배열 요소로 이동
	printf("pb - pa : %u\n", pb - pa); // 두 포인터 뺄셈
	printf("앞에 있는 배열 요소의 값 출력 : "); // pa가 배열의 앞에 있으면 *pa(포인터)출력
	if (pa < pb) printf("%d\n", *pa);	// pb가 배열의 앞에 있으면 *pb 출력
	else printf("%d\n", *pb);

	return 0;
}

 

728x90