20140318 (포인터, &, *, (int *) )
22일차
---------------
포 인 터
---------------
- 주소 값을 저장하는 변수. 기호는 * 로 쓴다.
지금까지 배운 * 기호의 역할이 4가지가 있는데
1. * : 곱셈
2. (type *) : 캐스팅
3. * : 주소를 따라가 그 곳에 저장된 값을 가리킴.
4. * : 포인터 변수 선언.
1번은 아는거고 2번에 대해서 우선 알아보자
먼저 전에 배웠던 & (Ampersand)를 변수 앞에 붙이면
그 변수의 주소값을 나타낸다고 배웠다.
2번, 3번을 보면 &과는 다른 값을 볼 수 있다.
다음 예제 소스를 보자
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum = 0;
// &iNum = 100;
// 주소상수 = 상수
// --> Error!
// 0x12FF74 = 100;
// 16진상수 상수
// --> Error!
// (int *)0x12FF74 = 100;
// 주소상수 상수
// --> Error!
*( (int *)0x12FF74 ) = 100;
// 16진 주소를 가르키는 값 상수
printf("iNum = %d \n", iNum);
printf("&iNum = 0x%08X \n", &iNum);
*( (int *)1245044 ) = 300;
// 10진 주소를 가르키는 값 상수
printf("iNum = %d \n", iNum);
printf("&iNum = %d \n", &iNum);
*( &iNum ) = 1000;
printf("iNum = %d \n", iNum);
printf("&iNum = 0x%08X \n", &iNum);
return 0;
}
출력 화면
위에 예제 소스를 보시다시피
(type *)메모리주소 가 그 해당하는 메모리주소를 나타내게 된다.
그 앞에다 * 을 붙이면 그 해당하는 메모리주소의 값을 지칭하게 된다.
밑에 예제 소스를 더 보자.
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum = 0;
int iCnt = 0;
printf("iNum : %d \n", iNum);
printf("&iNum : 0x%08X \n", &iNum);
printf("iCnt : %d \n", iCnt);
printf("&iCnt : 0x%08X \n", &iCnt);
*((int*)0x12FF70) = 100;
*((int*)0x12FF74) = 100;
printf("\niNum : %d \n", iNum);
printf("&iNum : 0x%08X \n", &iNum);
printf("iCnt : %d \n", iCnt);
printf("&iCnt : 0x%08X \n", &iCnt);
return 0;
}
출력화면
이렇게 메모리 주소를 통하여 다른 메모리를 접근 할 수 있게 된다.
그런데 다른 메모리에 접근 할 때마다 번거로우니
4번이 필요하다
예제를 보자
ex) 예제 소스
#include <stdio.h>
int main()
{
int iNum = 0;
int iAddr = 0;
int * iP;
printf("&iNum : 0x%08X \n", &iNum);
printf("&iAddr : 0x%08X \n", &iAddr);
iAddr = (int)(&iNum);
printf("iAddr : %08X \n", iAddr);
printf("iNum : %08X \n", iNum);
*(int *)iAddr = 1000;
printf("iNum : %d \n", iNum);
iP = &iNum;
*iP = 999;
printf("iNum : %d \n", iNum);
return 0;
}
출력 화면
어쨋든 정리를 하자면
100 int형 정수
iNum int형 정수
&iNum int *형 주소상수 (자신 주소값)
(int *)iNum int *형 주소상수 (저장된 주소값)
ipNum int *형 주소상수 (저장된 주소값)
*((int *)iNum) iNum에 저장된 주소값을 따라가 그 안에 저장된 값.
*ipNum iPNum에 저장된 주소값을 따라가 그 안에 저장된 값.
여기서 그냥 하는 얘기인데
*( (int *)0x0012FF74 ) = 100;
를 왜 쓰나 싶었는데, 어셈블리에서는
변수 대신 저렇게 주소값으로 쓴다고 한다.