배열(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;

}

----------------------------------------------------------------------------------------

 배열의주소는 int형이라 4바이트씩 즉 4씩 차이가나고, int형 변수 a,b,c는 규칙없이 각기 다른 주소에 저장되었습니다.

 

 이제 배열을 이용해 포인터를 사용해 보겠습니다. 아래 코드는 배열에 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가 출력이됩니다.


포인터 변수는 사용자의 입력을 받을때의 변수로도 사용할 수도 있습니다. 

----------------------------------------------------------------------------------------

#include <stdio.h>

#pragma warning(disable:4996)


int main()

{

int input;

int *pointer;

pointer = &input;


printf("정수 입력 : ");

scanf("%d", pointer);

printf("입력된 정수 : %d \n", *pointer);

}

----------------------------------------------------------------------------------------


 마지막으로, 포인터 변수를 이용해서 문자열을 입력받아 대문자는 소문자로 소문자는 대문자로 바꾸는 코드를 작성해 봤습니다. 포인터 변수로 입력을 받고, 출력은 배열로 했습니다.

----------------------------------------------------------------------------------------

#include <stdio.h>
#pragma warning(disable:4996)

int main(){

char change[10];
char *input;
input = &change;

printf("영문을 입력하시면 대소문자가 서로 변환됩니다. 입력 : ");
scanf("%s", input);

while (*input){ 
if (*input >= 'A' && *input <= 'Z') // 대문자일 경우
{
*input = *input + 32;
}
else if (*input >= 'a' && *input <= 'z') // 소문자일 경우
{
*input = *input - 32;
}
input++;
}
printf("변환된 문자 : %s \n", change);
}

----------------------------------------------------------------------------------------

조건문에서 왜 +32, -32 연산을 하는지 이해가 안되시는분은 조건문 게시글 http://parkdream.tistory.com/11 을 참고하시면 됩니다. 

 *input+32, -32 대신 *input-'A'+'a' *input-'a'+'A'를 사용하셔도 됩니다.

결과는 아래와 같이 대소문자가 서로 바뀌어서 출력됩니다.


* 출처 : 한국기술교육대학교 온라인평생교육원 C 프로그래밍_2 

          스타일 C프로그래밍 저.김종훈,김종진 출.WellBook




'언어 > C' 카테고리의 다른 글

[C] 공용체  (0) 2016.12.27
[C] 구조체  (2) 2016.12.26
[C] 포인터  (0) 2016.12.23
[C] 배열  (0) 2016.12.23
[C] 디버깅  (0) 2016.12.21

+ Recent posts