2015년 7월 2일 목요일

20150702 포인터의 이해(★포인터 변수)

주소만 전문적으로 저장하는 타입 = 포인터타입
32bit(bus가) cpu체제에서는 4바이트 주소값을 가지기 때문에 포인터를 선언할때
4바이트로 선언하여 사용하는것이 좋다!

포인터를 선언할때 *(type)을 변수이름 앞에 붙여준다!(★자료형)
int, double등 같이 선언해야한다!(예 int *ip; // (int)정수를 가리키는 ★포인터 변수)

★포인터변수를 선언할때 선언만 해놓고 이후에 유효한 주소값을 채워넣을 경우
*ip=0; || *ip=NULL; // NULL은 사실상 0을 의미함
위의 초기화하는 값 0을 가리켜 '널 포인터'라 한다. 이는 0번지를 의미하는것이 아니라
"아무데도 가리키지 않는다!!"

주소값만을 사용하여 변수를 수정가능
*((int *)0x12FF3C)=38; // 포인터 변수를 쓰지않고 주소값만을 사용하여 변수 수정방법

자료형  변수이름   주소값
int       iNum        0012FF3C
int*      ip             0012FF38

c에서 *의미 2항 연산자(곱하기), 단항 연산자(포인터)
iNum앞에 *을 붙이면 2항 연산자로 인식해서 컴파일시 에러가 뜬다!

ip=100; // ip에 100을 넣는다!
*ip=100; // ip에 저장된 포인터주소값을 따라가서 대응하는 곳에 100을 넣는다!

예제

#include <stdio.h>

int main()
{
int iNum=100;
int *ip;

printf("iNum Value(값)       : %d\n", iNum);
printf("iNum Address(주소값) : %08X\n", &iNum);
printf("ip Address(주소값)   : %08X\n", &ip);
// printf("ip Value(값)       : %08X\n", ip);

ip=&iNum;

printf("ip Value(값)         : %08X\n", ip);
// printf("ip Address(주소값)   : %08X\n", &ip);
printf("ip Address(주소값)   : %d\n", *ip);
return 0;
}

ip는 iNum을 가리킨다!

예제
#include <stdio.h>

int main()
{
int A=99;
int *p=&A;

*p=100;
printf("%08X\n", &A);

*((int *)0x12FF3C)=38; // *(int *)은 주소를 인지시킨다!
                                        // type casting operator(형변환 연산자)
printf("%d\n", A);

return 0;
}

댓글 없음:

댓글 쓰기