32비트 시스템
64비트 시스템

포인터의 크기가 클수록 메모리 전체에 한 번에 접근할 수 있다.
따라서 포인터의 크기는 크면 클수록 좋지만, I/O Bus가 한 번에 송수신할 수 있는 데이터의 크기만큼 클 때 가장 효율적이다.
64비트 시스템을 고려한 프로그래밍으로 자료형에 대해 고려해야 함.

#include <stdio.h>
#include <tchar.h>
int _tmain(int argc, TCHAR* args[])
{
int arr[10] = {0,};
int arrVal = (int)arr; // 데이터 손실이 발생할 수 있는 위치
printf("pointer: %d\n", arrVal);
return 0;
}
#if defined(_WIN64)
typedef __int64 LONG_PTR;
typedef unsigned __int64 ULONG_PTR;
typedef __int64 INT_PTR;
typedef unsigned __int64 UINT_PTR;
#else
typedef long LONG_PTR;
typedef unsigned long ULONG_PTR;
typedef int INT_PTR;
typedef unsigned int UINT_TPR;
#endif
// 위에서 PTR은 POINTER가 아님. 포인터 연산을 위한 Polymorphic 자료형.
아래의 포인터 연산 예시에서 UINT_PTR 대신 UNIT를 사용한다면, UNIT는 4바이트이므로 64비트 시스템에서는 문제가 생길 수 있다. 따라서 UINT대신 Polymorphic 자료형인 UINT_PTR를 사용하는 편이 좋다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <math.h>
UINT_PTR CalculateDistance(UINT_PTR uDest, UINT_PTR uSour)
{
return uDest - uSour;
}
int _tmain(int argc, TCHAR* args[])
{
INT val1 = 10;
INT val2 = 20;
// 두 포인터 사이의 거리를 구하고자 함.
_tprintf(_T("Address: %p, %p\n"), (UINT_PTR)&val1, (UINT_PTR)&val2);
_tprintf(_T("Distance between two address: %d\n"), CalculateDistance((UINT_PTR)&val1, (UINT_PTR)&val2));
return 0;
}
함수 호출의 성공여부를 확인할 수 있다.
윈도우 시스템에서는 오류가 발생할 때마다 전역 공간에 오류의 이유를 저장해둔다. GetLastError()함수는 해당 전역 공간에 접근해서 저장된 값을 가져온다. 해당 값을 가지고 오류의 원인을 알 수 있다.

ex) GetLastError 함수 호출 예시 (존재하지 않는 파일을 찾을 경우)
int _tmain(int argc, TCHAR* args[])
{
HANDLE hFile = CreateFile( // Windows system 함수
_T("ABC.DAT"), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile) // INVALID_HANDLE_VALUE는 에러 발생 유무 체크 벨류
{
_tprintf(_T("Error code: %d\n"), GetLastError());
// 에러가 발생했다면 이렇게 바로 호출해야 함.
// 에러가 발생하고 다른 Windows System 함수를 호출하고 GetLastError()를 호출하면 바뀔수도 있음에 주의.
return 1;
}
return 0;
}