MalangBaram LAB

[C]포인터 사용 -1- 본문

프로그래밍/C

[C]포인터 사용 -1-

프요 2016. 2. 29. 19:32

포인터?

포인터는 변수 값이 저장된 메모리의 위치를 직접 나타내는 기능입니다. 정확히 변수가 저장되어 있는 위치의 주소를 저장하는 특별한 변수죠.




주소(Address)

변수 값의 메모리 주소는 주소 연산자 &를 이용해서 사용할 수 있습니다.


코드
#include <stdio.h>

int main(void) {

  int a,b;
 
  a = 3;
  b = 5;

  printf("a = %d, b = %d \n", a, b);
  printf("&a = %p, &b = %p \n", &a, &b);
  return 0;
}

실행 결과
a = 3, b = 5
&a = 0061FF24, &b = 0061FF20


변수의 주소는 따로 %p를 사용합니다. 주소 값은 실행하는 컴퓨터마다 다를 수 있습니다. 다만 주소 값보단 변수는 메모리 어딘가에 위치하고 있고 그 주소를 가지고 있다 라고만 생각해 주시면 됩니다.




포인터 사용

일단 포인터를 어디에서 사용할 수 있을까는 뒤로 미루고 어떻게 사용하냐 부터 알아보도록 하겠습니다. 포인터 선언은 기존 변수 선언과 동일하고 이름 앞에 *만 붙혀주면 됩니다.


int *pA, *pB;

이 선언한 부분을 '*pA는 int형이다'라고 부릅니다. 포인터를 선언 했으니 이번에는 직접 사용해 보도록 하겠습니다.


코드

#include <stdio.h>

int main(void) {
  int a,b;        //변수 a, b 선언
  int *pA, *pB;   //포인터 pA, pB 선언

  //a, b 초기화
  a = 3;
  b = 5;
  
  //pA, pB 초기화 변수의 주소값을 넣어야 함!(& 사용)
  pA = &a;
  pB = &b;

  printf("a = %d, b = %d \n", a, b); 
  printf("a = %p, b = %p \n", &a, &b);
  printf("*pA = %d, *pB = %d \n", *pA, *pB);
  printf("pA = %p, pB = %p \n", pA, pB);

  return 0;
}

결과 값
a = 3, b = 5
&a = 0061FF24, &b = 0061FF20
*pA = 3, *pB = 5
pA = 0061FF24, pB = 0061FF20


전체 코드는 보지 않고 prinf부분만 보겠습니다.


  printf("a = %d, b = %d \n", a, b);
  printf("&a = %p, &b = %p \n", &a, &b)
  printf("*pA = %d, *pB = %d \n", *pA, *pB);
  printf("pA = %p, pB = %p \n", pA, pB);

 a와 b는 *pA와 *pB랑 결과 값이 같고 &a와 &b는 pA와 pB와 결과 값이 같습니다. pA와 pB는 주소값을 넣었으니 당연히 주소 값이 나오는 게 맞지만 *pA와 *pB는 무슨 값이 나온 걸까요?


선언할 때 *를 붙혀서 포인터를 선언했으면 이 포인터는 *를 통해서 주소 값에 있는 변수의 값을 간접 참조할 수 있습니다. 여기서 *는 간접 참조 연산자라 부릅니다.


즉 '포인터 pA와 a는 같은 것을 나타내고 있다'라고 요약할 수 있습니다.



"같은 거면 왜 포인터를 따로 사용하는 거지?"에 대한 내용은 다음 편에...

'프로그래밍 > C' 카테고리의 다른 글

[C]포인터 사용 -1-  (0) 2016.02.29
0 Comments
댓글쓰기 폼