함수 내에서 int a=10; 하면 스택 내에 int 크기 만큼 ( 32비트 컴파일러에서는 4바이트 ) 할당이 됩니다. ( 스택 프레임이 내려 가는 것이죠. ) 그리고 이 4바이트에는 10이라는 값이 써지게 됩니다.
이 스택의 주소를 알고 싶을 때 &a 를 하면 되는 것이죠.
그리고 함수 내에서 int *a; 라고 선언을 하면 스택 내에 int * 크기 만큼 ( 32 비트 컴파일러에서는 4바이트 ) 할당이 됩니다. ( 역시 스택 프레임이 내려 갑니다. )
a 는 포인터의 정의에 의해서 어떠한 주소 값을 갖게 됩니다. 물론 new 나 malloc, calloc 로 할당을 받았을 경우에 말이죠. ( int b = 10; int *a = &b; 와 같은 건 좀 나중에 얘기 합시다 -_- )
처음에 설명했던 int a = 10; 의 경우에는 스택에 직접 10이 쓰여지는데 반해, int *a는 스택 내에 a 가 가리키는 곳의 주소가 들어갑니다. (스택이나 힙 아무거나 가능하죠. )
이 주소가 가리키는 메모리의 값을 알고 싶을 때 *a 라고 쓰면 되는 겁니다. int b =10; int *a = &b; 와 같은 것도 이것과 같은 원리로 설명이 되죠
그림을 그려본다면 -0-
void func()
{
int a=10;
}
이런 함수가 있을 때의 stack frame 은
----------------------- 함수 func 의 stack frame 처음 위치 0xffff0004 (주소는 임의로 정했습니다. )
00 00 00 0a 0xffff0000 <---- 이 주소가 바로 a의 주소죠. &a 하면 0xffff0000 가 나옵니다. *(&a) 하면 0xffff0000가 가리키는 값이므로 0x0000000a 즉 10이 나오겠죠.
-----------------------
( 사실 endian에 의해 0a 00 00 00 이 적혀 있을 수도 있지만 -_- endian 은 논외로 합시다 -_- )
이와 같이 되죠. 실제로는 컴파일러마다 구현이 다르고 cisc 냐 risc냐에 따라 스택 프레임을 어떻게 저장하고 복구하고, 리턴값을 레지스터에 저장하고 하는 규약이 달라
위보다 복잡한 스택 프레임이 설정되지만 기본 원리는 저렇습니다. -_-
포인터를 쓸 때를 보면
void func()
{
int *a = (int *)malloc(sizeof(int));
}
이런 함수가 있다고 하면
스택 프레임은
------------------ 0xffff0004 역시 함수 func의 시작주소 입니다.
f0 00 ab cd <-- int *a 라고 선언 했으므로 int * 크기 만큼 (4바이트) 할당을 하고, 거기에 malloc(sizeof(int))의 결과 값을 저장을 합니다. malloc 는 힙 내에 sizeof(int) 만큼을 할당 받아 그 주소를 돌려주죠
------------------
0xf000abcd 는 힙 내의 주소 입니다. 여기에 int 1개 의 값을 적어 넣을 수 있습니다.
만약에 *a = 20; 이라고 malloc 다음 줄에 적었다면 0xf000abcd 에 4바이트 크기로 20이라는 값이 적힐겁니다.
즉 0xffff0000에는 0xf0000abcd가 적혀 있고 0xf000abcd에는 20이 적혀 있다는 겁니다.
책을 보다가 보신 내용이 이 내용입니다.
2006.09.28 23:03:56 (*.197.132.177)
비밀
번역를 허접하게 해석해도 저렇게 안나올텐데-_-;;
그냥 일반 변수는 &연산자로 데이터의 주소를 보내고 포인터 변수는 그자체가 데이터 주소다 .. 뭐 이런소리 같은데..
그책 보지마세요..
2006.09.29 00:14:32 (*.48.77.63)
꼬마네꼬
번역이 좀 너무했군요. 책을 바꾸시는 게 좋을듯 합니다.
2006.09.29 14:41:49 (*.102.122.211)
안군
int *pnInt; // 포인터 변수 선언
int nInt; // 일반 변수 선언
pnInt = &nInt // 이렇게 하면 pnInt는 nInt를 가르키죠. 즉, (*pnInt) == nInt 가 됩니다.
이 스택의 주소를 알고 싶을 때 &a 를 하면 되는 것이죠.
그리고 함수 내에서 int *a; 라고 선언을 하면 스택 내에 int * 크기 만큼 ( 32 비트 컴파일러에서는 4바이트 ) 할당이 됩니다. ( 역시 스택 프레임이 내려 갑니다. )
a 는 포인터의 정의에 의해서 어떠한 주소 값을 갖게 됩니다. 물론 new 나 malloc, calloc 로 할당을 받았을 경우에 말이죠. ( int b = 10; int *a = &b; 와 같은 건 좀 나중에 얘기 합시다 -_- )
처음에 설명했던 int a = 10; 의 경우에는 스택에 직접 10이 쓰여지는데 반해, int *a는 스택 내에 a 가 가리키는 곳의 주소가 들어갑니다. (스택이나 힙 아무거나 가능하죠. )
이 주소가 가리키는 메모리의 값을 알고 싶을 때 *a 라고 쓰면 되는 겁니다. int b =10; int *a = &b; 와 같은 것도 이것과 같은 원리로 설명이 되죠
그림을 그려본다면 -0-
void func()
{
int a=10;
}
이런 함수가 있을 때의 stack frame 은
----------------------- 함수 func 의 stack frame 처음 위치 0xffff0004 (주소는 임의로 정했습니다. )
00 00 00 0a 0xffff0000 <---- 이 주소가 바로 a의 주소죠. &a 하면 0xffff0000 가 나옵니다. *(&a) 하면 0xffff0000가 가리키는 값이므로 0x0000000a 즉 10이 나오겠죠.
-----------------------
( 사실 endian에 의해 0a 00 00 00 이 적혀 있을 수도 있지만 -_- endian 은 논외로 합시다 -_- )
이와 같이 되죠. 실제로는 컴파일러마다 구현이 다르고 cisc 냐 risc냐에 따라 스택 프레임을 어떻게 저장하고 복구하고, 리턴값을 레지스터에 저장하고 하는 규약이 달라
위보다 복잡한 스택 프레임이 설정되지만 기본 원리는 저렇습니다. -_-
포인터를 쓸 때를 보면
void func()
{
int *a = (int *)malloc(sizeof(int));
}
이런 함수가 있다고 하면
스택 프레임은
------------------ 0xffff0004 역시 함수 func의 시작주소 입니다.
f0 00 ab cd <-- int *a 라고 선언 했으므로 int * 크기 만큼 (4바이트) 할당을 하고, 거기에 malloc(sizeof(int))의 결과 값을 저장을 합니다. malloc 는 힙 내에 sizeof(int) 만큼을 할당 받아 그 주소를 돌려주죠
------------------
0xf000abcd 는 힙 내의 주소 입니다. 여기에 int 1개 의 값을 적어 넣을 수 있습니다.
만약에 *a = 20; 이라고 malloc 다음 줄에 적었다면 0xf000abcd 에 4바이트 크기로 20이라는 값이 적힐겁니다.
즉 0xffff0000에는 0xf0000abcd가 적혀 있고 0xf000abcd에는 20이 적혀 있다는 겁니다.
책을 보다가 보신 내용이 이 내용입니다.