#include <stdio.h>
double d = 3.14;
struct test
{
int a;
double *d;
}x={100,&d};
struct test*func(void)
{
return &x;
}
void my_test(char a, ...)
{
printf("%f\n",**(double**)((unsigned char*)&a+4));
printf("%f\n",*(*(struct test**)((unsigned char*)&a+8))->d);
printf("%f\n", *((*((struct test* (**) (void))(&a+12)))()->d)) ;
}
void main(void)
{
my_test('A',&d,&x,func);
}
함수가 호출 되고 매개변수들은 지역변수 임으로 스택에 차곡차곡 채워집니다.
함수가 호출 되고 매개변수들은 지역변수 임으로 스택에 차곡차곡 채워집니다.
이때 매개변수들은 오른쪽에서 부터 변수들이 메모리공간에 채워지죠.
이때 그래서 char a 의 주소가 맨 마지막에 쌓이게 되는거죠
32비트에 체제에서는 프로세서가 빨리 수행하기 위해서 4바이트씩 처리합니다 그러므로서 메모리가
4바이트씩 채워지죠 +.+
그래서 스택을 4씩증가하고 주소값을 이용하여 접근해야되는데 주소값을 넘을려면 포인터가 필요하죠
당연히 원하는 형으로 캐스팅 해줘야 됩니다.
여기서 팁 원하는 형으로 캐스팅 해주고 그값을 담을려고 합니다. 그 주소값에 담긴것은 무엇일까요??
바로 주소값이 또 담겨 있는것입니다. 메모리에 저장된 그 주소값으로 접근해야 우리가 원하는 값이
출력 되는것입니다. 그러므로 더블 포인터를 쓴 이유죠 +.+
이때 그래서 char a 의 주소가 맨 마지막에 쌓이게 되는거죠
32비트에 체제에서는 프로세서가 빨리 수행하기 위해서 4바이트씩 처리합니다 그러므로서 메모리가
4바이트씩 채워지죠 +.+
그래서 스택을 4씩증가하고 주소값을 이용하여 접근해야되는데 주소값을 넘을려면 포인터가 필요하죠
당연히 원하는 형으로 캐스팅 해줘야 됩니다.
여기서 팁 원하는 형으로 캐스팅 해주고 그값을 담을려고 합니다. 그 주소값에 담긴것은 무엇일까요??
바로 주소값이 또 담겨 있는것입니다. 메모리에 저장된 그 주소값으로 접근해야 우리가 원하는 값이
출력 되는것입니다. 그러므로 더블 포인터를 쓴 이유죠 +.+
'Soft Ware > C 언어!!' 카테고리의 다른 글
#ifndef ~ #endif 와 #pragma once의 차이점 (0) | 2011.10.09 |
---|---|
함수 포인터와 구도체를 이용한 클래스 따라하기 !! (0) | 2011.10.08 |
void 형 포인터 연산 (0) | 2011.09.29 |
함수 포인터에 대해서 !!! (0) | 2011.08.07 |
동적 메모리 할당 (0) | 2011.08.07 |