-
20140318 (포인터, &, *, (int *) )부산IT학원/스마트컨트롤러 2014. 3. 18. 17:22
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;
를 왜 쓰나 싶었는데, 어셈블리에서는
변수 대신 저렇게 주소값으로 쓴다고 한다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140320 (포인터, Hexa View, 함수) (0) 2014.03.20 20140319 (포인터, little endian, big endian, 포인터 연산) (0) 2014.03.19 20140317 (break, continue, switch, debug) (0) 2014.03.17 20140314 (for, if, 삼항연산자) (0) 2014.03.14 20140313 (while, do while, 중첩 while) (0) 2014.03.13