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;
}
#include 
#include 
using namespace std;
int main()
{
int result, sum = 10, divisor=0;
result = sum / divisor;
cout << "Result = " << result << endl;
return 0;
}


위의 코드는 컴파일러가 제수가 0이 되는 에러를 잡지 못한다.
이럴때 assert()를 사용해서 false가 될경우 프로그램이 종료되게 할 수 있다.

#include 
#include 
using namespace std;
int main()
{
int result, sum = 10, divisor=0;
assert(divisor!=0);
result = sum / divisor;
cout << "Result = " << result << endl;
return 0;
}


Output
===================================================================================
t: t.cpp:8: int main(): Assertion `divisor!=0' failed.
Disallowed system call: SYS_kill
===================================================================================

assert() 코드 기능을 사용하고 싶지 않다면 #include 위에
#define NDEBUG 를 넣어주면 된다.


소켓 프로그래밍을 공부하다가 책을 그대로 따라했는데 에러가 발생.
프로젝트 속성에 링크-입력  들어가 추가종속서에 라이브러리를 추가
ws2_32.lib

+ Recent posts