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으로 쓴다.
포인터를 이해하지 않고 사용할 경우 생기는 위험성이 크고,
팀 작업의 경우 자신의 잘못된 포인터 사용으로 온종일 디버깅해야 하는 경우도 생길 수 있다.
포인터를 이용해서 참조 호출을 할 경우 원래의 값이 바뀌기 때문이다.
하지만 간단한 포인터 예제를 통해서 이해만 한다면 거부감이 조금은 사라질 것이다.
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; }