3 분 소요

#include
#ifdef ____what____
금일은 포인터 관련 선언에대해서 고찰해보겠다.
변수를 선언하고 초기화 해주듯이
포인터 변수도 선언을 하면 초기화를 해줘야한다.
그 초기화를 자동으로 해주는것이 alloc 삼총사라고 한다.
아 그리고 메모리는 free해줘야지만 컴터가 미치지 않는다.

포인터 변수의 초기화 방법은 alloc 삼총사만 있는것은 아니다.
FIRST 부분에서 보면 알것이다.
SECOND 켁 목적과 다르게.. 이것참.. 다른 테스트를 하는중이다.
우선 int형을 선언하고 char 형 포인터를 선언한후
연결해 주고 char형 포인터의 내용을 바꾸게되면
int형의 내용이 바뀌게 되는데 이것은 어떤식으로
데이터가 저장이 되어서 바뀌는것일까? 궁굼하지 않은가 ?
촐리 궁굼하다 그래서 확인해볼련다.
THIRD 음.. 두번째 정리해서 결과 정리한다.. 이것참 재미있지 않은가 하하.
FOURCH 두번째에서 궁굼했던 점을 정리한다..
이상하게
&test_p,&test_p[1],&test_p[2],&test_p[3]
ㅋㅋ == &test_p[i]=test_p+i 이군 .. 아래랑은 당연히 틀려야하네

&test_p,&test_p+1,&test_p+2,&test_p+3
이 경우는 그냥 레지스터 변수에 더하는것이니 int형 주소값에
1씩더하면 결국 4바이트씩 느는게 당연하다.

#endif

int main(int argc, char *argv[])
{
//#define FIRST // 변수를 선언하고 그것을 바탕으로 초기화를 하는 방법.
//#define SECOND // 갑자기 궁굼해져서 테스트 해보는중
#define THIRD //SECOND 정리
//#define FOURTH //궁굼

#ifdef FIRST

int * test_p;
int i=1111111;
test_p = &i //이것도 초기화 방법중에 하나이다. ㅋㅋ

*test_p = 11;
//printf (“%d %d %d %d
“,&i,&i+1,&i+2,&i+3);
printf (“포인터 변수에 저장된 주소값 %d 포인터변수의 주소값 %d 인트형 변수의 주소값 %d
“, test_p, &test_p, &i);
printf (“포인터변수의 내용 %d 인트형 변수의 내용 %d
“,*test_p, i);

//자 포인터변수의 사용방법에 대해서 다시 한번 생각을 해보는 시간을 가져야할것같다
//보면알것지만….
//test_p : 포인터 변수 test_p에 저장된 주소값(내용)
//*test_p : 포인터 변수 test_p에 저장된 주소값에 있는 내용
//&test_p : 포인터 변수 test_p의 주소값

test_p = (int *)&i //나름대로 동기화~

//printf(“%d
“,*test_p);
//*test_p = 11;
//printf(“%d
“,i);

printf (“test_p=(int*)&i한 후의
포인터변수의 주소값 %d 인트형 변수의 주소값 %d
“,&test_p, &i);

printf (“포인터변수의 내용 %d 인트형 변수의 내용 %d
“,*test_p, i);
#endif //FIRST END

#ifdef SECOND
char * test_p;
int i=0xffffffff;

test_p = (char*)&i
//char pointer로 케스팅을 하여 주소값이 1씩 증가하게 만들었다 푸헬
//printf (“%d %d
“,(char *)&i,((char *)&i)+1);
printf (“int 변수가 저장된 주소값 %d 저장된 내용 %d
“,&i,i);
printf (“int 변수를 1바이트씩 나눠서 표시 %d %d %d %d

,(char *)&i,((char *)&i)+1, ((char *)&i)+2, ((char *)&i)+3);
printf (“int 변수를 1바이트씩 출력 %u %u %u %u

,*((char *)&i),*(((char *)&i)+1),*(((char *)&i)+2),*(((char *)&i)+3));

*test_p = 0xff;
test_p[1] = 0xff;
test_p[2] = 0xff;
test_p[3] = 0xff;

// 음 INT는 ox test_p[3], test_p[2], test_p[1], test_p[0]이순서로 저장되네
// 그러니까 제일 낮은수가 test_p[0]라는 말씀.. 캬~~~
// 이제 무언가 잡히는구나..

printf (“int 변수가 저장된 주소값 %d 저장된 내용 %d
“,&i,i);
printf (“int 변수를 1바이트씩 나눠서 표시 %d %d %d %d

,(char *)&i,((char *)&i)+1, ((char *)&i)+2, ((char *)&i)+3);
printf (“int 변수를 1바이트씩 출력 %u %u %u %u

,*((char *)&i),*(((char *)&i)+1),*(((char *)&i)+2),*(((char *)&i)+3));

#ifdef delay
printf (“%u %u %u %u
“,&test_p,&test_p[1],&test_p[2],&test_p[3]);
printf (“%u %u %u %u
“,&test_p,&test_p+1,&test_p+2,&test_p+3);
위의 두 표현이 무엇이 다른것인가? 모르것다구 그럼 해봐라.
#endif //delay

//printf (“%d %d %d %d
“,test_p[0],test_p[1],test_p[2],test_p[3]);
//내가보고싶은것은 i값이 저장되어있는 4바이트의 변화다.
//printf (“%d %d %d %d
“,&i,&i+1,&i+2,&i+3);
//printf (“%d 포인터변수의 주소값 %d 인트형 변수의 주소값 %d
“, test_p, &test_p, &i);
printf (“
포인터변수의 내용 %u 인트형 변수의 내용 %u
“,*test_p, i);

#endif// end SECOND

#ifdef THIRD

char * test_p;
int i=111111;

test_p = (char*)&i

printf (“int 변수가 저장된 주소값 %d 저장된 내용 %d
“,&i,i);
printf (“int 변수를 1바이트씩 나눠서 표시하기위한 주소값 확인
%d %d %d %d

,(char *)&i,((char *)&i)+1, ((char *)&i)+2, ((char *)&i)+3);
printf (“int 변수를 1바이트씩 나눠서 출력 %u %u %u %u

,*((char *)&i),*(((char *)&i)+1),*(((char *)&i)+2),*(((char *)&i)+3));

//char형 포인터의 내용이다.
//test_p가 가리키는 주소값의 내용이니까 int형의 첫번째 바이트값이된다.
//test_p+1이 가리키는 주소값의 내용은 int 형의 두번째 바이트값이 된다.
//나머지 두가지도 마찬가지가 된다. 하하.. 잼나네..
//여기서 리틀엔디안이라는 말이 나오는 것일까??

printf(“
test_p, test_p[1], test_p[2], test_p[3] 입력
“);
*test_p = 11;
test_p[1] = 0;
test_p[2] = 0;
test_p[3] = 0;

// 음 INT는 ox test_p[3], test_p[2], test_p[1], test_p[0]이순서로 저장되네
// 그러니까 제일 낮은수가 test_p[0]라는 말씀.. 캬~~~
// 이제 무언가 잡히는구나..

// 아 그리고 int형의 데이터는 0xffffffff 까지. 즉 4바이트저장이다.
// int는 4바이튼까 0xffff 이거라고 생각하면 나처럼된다 푸헬..

printf (“
int 변수가 저장된 주소값 %d 저장된 내용 %d
“,&i,i);
printf (“int 변수를 1바이트씩 나눠서 표시 %d %d %d %d

,(char *)&i,((char *)&i)+1, ((char *)&i)+2, ((char *)&i)+3);
printf (“int 변수를 1바이트씩 출력 %u %u %u %u

,*((char *)&i),*(((char *)&i)+1),*(((char *)&i)+2),*(((char *)&i)+3));

printf (“
포인터변수의 내용 %u 인트형 변수의 내용 %u
“,*test_p, i);

#endif // end THIRD

#ifdef FOURTH

char * test_p;
int i=0xffffffff;

test_p = (char*)&i

// test[i]= *(test+i)
// &test[i]= test+i
printf (“%u %u %u %u
“,&test_p[0],&test_p[1],&test_p[2],&test_p[3]);
printf (“%u %u %u %u
“,test_p,test_p+1,test_p+2,test_p+3);
// 위의 두경우는 char형 test_p가 가리키는 번지수이다.

// &&test[i]=&(test+i) 여기서 (test+i)는 레지스터의 주소값이 된다.
// int형인 ㅋㅋㅋ
printf (“%u %u %u %u
“,&test_p,&test_p+1,&test_p+2,&test_p+3);

// 위의 경우는 test_p의 주소값이 저장된 주소값이다.
// 레지스터값은 INT형이므로 이렇게 나오는게 당연하다.
#endif //FOURTH END
return 0;

}