배열(Array)과 포인터(Pointer)
제목을 배열과 포인터라고 한 이유는, 배열을 이용해 포인터를 사용하고 포인터를 이용해 배열을 사용하기 때문입니다. 포인터는 주소를 가리키는 것인데, 배열은 메모리 일정공간에 연속으로 존재하기때문에, 배열을 이용해 포인터를 사용할 수 있습니다.
배열의 주소는 어떻게 표현할까요? 변수의 주소처럼 &를 붙여 &arr[0]이렇게도 표현할 수 있지만, 배열의 이름 자체가 배열의 첫번째 원소의 주소입니다. 배열의 이름을 포인터 상수 라고도 하는데, 포인터 상수는 주소값의 변경이 불가능합니다.
아래 코드는 정수형 변수와 배열의 주소 비교입니다.
----------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
int a, b, c;
int d[3];
printf("a : %d, b : %d, c : %d \n",&a,&b,&c);
printf("d[0] : %d d[1] : %d d[2] : %d \n", &d[0], &d[1], &d[2]);
return 0;
}
----------------------------------------------------------------------------------------
이제 배열을 이용해 포인터를 사용해 보겠습니다. 아래 코드는 배열에 hello 라는 문자열을 넣고 포인터 변수를 선언해 주소를 가리킨뒤에 포인터를 출력해보는 코드입니다.
----------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
char text[6] = "hello"; // 널값을 포함한 문자열의길이 6바이트
char *pointer; // 포인터 변수 선언
pointer = text;
printf("text : %s \n", text); // 배열주소의 값 출력
printf("pointer : %s \n", pointer); // 포인터가 가리키는 주소의 값 출력
printf("--------------- \n");
int i;
for (i = 0; i < 5; i++){
printf("%.1s \n",pointer+i); // 맨 앞글자만 출력
}
----------------------------------------------------------------------------------------
아래 결과를 보면 포인터 변수 역시 배열의 주소를 가리켜서 같은 hello가 출력이 됩니다. 원소를 한글자씩 출력하기위해서 반복문안에 출력문을 포맷을 %.1s로 지정했는데, %s로 지정 하면 포인터가 가리키는 주소도 1씩 증가해서 hello, ello, llo, lo, o가 출력이됩니다.
포인터 변수는 사용자의 입력을 받을때의 변수로도 사용할 수도 있습니다.
----------------------------------------------------------------------------------------
#pragma warning(disable:4996)
int main()
{
int input;
int *pointer;
pointer = &input;
printf("정수 입력 : ");
scanf("%d", pointer);
printf("입력된 정수 : %d \n", *pointer);
}
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
조건문에서 왜 +32, -32 연산을 하는지 이해가 안되시는분은 조건문 게시글 http://parkdream.tistory.com/11 을 참고하시면 됩니다.
스타일 C프로그래밍 저.김종훈,김종진 출.WellBook