C언어에서 포인터를 이해하는 것은 생각만큼 쉽지 않다.
포인터를 이해하지 않고 사용할 경우 생기는 위험성이 크고,
팀 작업의 경우 자신의 잘못된 포인터 사용으로 온종일 디버깅해야 하는 경우도 생길 수 있다.
포인터를 이용해서 참조 호출을 할 경우 원래의 값이 바뀌기 때문이다.

하지만 간단한 포인터 예제를 통해서 이해만 한다면 거부감이 조금은 사라질 것이다.

int age;
여기서 age는 변수명이고, int는 자료형이다.
32bit 에서 int는 4바이트이므로,
메모리상에서 어떤 4바이트 공간을 작업자는 age라고 부른다.
age = 26;
을 하게 되면 그 4바이트 공간에 26이라는 값이 들어가게 되고,
결국 age는 26이라는 값을 갖게 되는것이다.

int* p_age;
p_age라는 변수는 int* 라는 자료형이다.
*는 포인터, 즉 '가리키는'이라고 이해하면 쉬울 것 같다.
말을 풀어쓰면,
p_age는 메모리상의 int 자료형을 가리키는 변수이다.

그래서 p_age변수는 int형을 자료형을 가진 다른 변수의 주소값을 자신의 값으로 가진다.
p_age = &age;

age라는 변수의 메모리상 주소가 0xA 라고 했을때,
p_age는 0xA 라는 값을 가지게 된다.

*p_age = 30;
p_age의 값 (0xA) 가 가리키는 변수(age) 의 값을 30으로 쓴다.


void dGet_value2(void* *p2)
{
  printf("&p2:0x%04x\n", &p2);
  printf("p2:0x%04x\n", p2);
  printf("*p2:0x%04x\n", *p2);
  printf("\n");

  static int value = 5;
  *p2 = &value;
}

void dGet_value1(int* *p1)
{
  printf("&p1:0x%04x\n", &p1);
  printf("p1:0x%04x\n", p1);
  printf("*p1:0x%04x\n", *p1);
  printf("\n");

  dGet_value2((void **)&(*p1));
}
int _tmain(int argc, _TCHAR* argv[])
{
  int* pmain;
  printf("&pmain:0x%04x\n", &pmain);
  printf("pmain:0x%04x\n", pmain);
  printf("\n");

  dGet_value1(&pmain);

  printf("pmain-> %d\n",*pmain);
	return 0;
}

+ Recent posts