저 역시 포인터 질문이요... 좀 헷갈려서요...
글쓴이: koonpal / 작성시간: 월, 2003/09/29 - 8:52오후
포인터 질문인데요...
예를 들어
struct message {
int a;
int b;
char c;
};
라고 정의 했을때요...
struct message* me;
unsigned char* m;
라고 하면 두개의 차이가 뭐죠...
둘다 4바이트씩 할당되어 처리되는 걸로 알고 있는데요???
차이가 있는 건가요...
잘 이해가 안 되네요...
그리고...
struct message a;
(unsigned char*)&a 라고 하면 무엇을 뜻하는 거죠???
부탁을 드립니다...
Forums:
시스템 마다 조금씩 다르지만 int 4byte, char 2byte.
시스템 마다 조금씩 다르지만
int 4byte, char 2byte...
뭐 이런 식입니다.
그러나 포인터는 모두 같습니다. 즉 int형 포인터든 char포인터든 struct의 포인터든 간에 포인터라는거 자체가 주소를 가리키고 있기때문에 모든 포인터의 크기는 4바이트가 됩니다.
==============================
Email : jungleahre@naver.com
Home :
==============================
포인터, 엑세스 범위
말씀하신데로 me 와 m 은 모두 4byte 입니다. (포인터의 사이즈)
포인터는 그것이 무엇을 가르키는(point) 지에 관계없이 4byte 라면
위의 unsigned char* 의 의미는 뭐겠습니까...
바로 포인터를 이용해 값에 접근할때 엑세스하는 범위를 의미합니다.
struct message* 형은 (패킹을 제외하고..) int,int,char 의 멤버를 가집니다.
그래서 9byte 겠죠. pointer 인 me 로 접근할때 9byte 씩 엑세스를 하게됩니다.... 흠..
밑의 m 은 unsigned char * 형이기때문에 1byte 의 엑세스 범위를 가지게 됩니다.
배열을 한번 생각해보세요.
int 배열과, struct 형 배열들을 인덱스로 구분할때..
가령...
저럴경우 a[0]~ a[9] 까지의 멤버들에 접근하는 방법과,
b[0] ~ b[9] 까지의 멤버에 접근하는 방법은 다르게 되겠죠?
한번 생각해보세요 ... ^^
ps. 말주변이 없어 이렇게 밖엔.. 흐흐 아마 밑에 다른분들이 멋진답변들 달아드릴겁니다. ^
간단히 말해서 포인터의 주소값이 가리키는 곳에 들어있는 값의 타입이라고나
간단히 말해서 포인터의 주소값이 가리키는 곳에 들어있는 값의 타입이라고나 할까요...?
물론 캐스팅을 이용해서 구라도 가능하죠 -_-
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
Re: 저 역시 포인터 질문이요... 좀 헷갈려서요...
포인터를 좀 더 추상적인 개념으로 이해하실 필요가 있습니다.
C 표준을 엄격하게 적용하자면, 모든 포인터형은 서로 호환되지 않습니다(좀 더 정확히 말하자면 서로 호환될 필요가 없습니다). 단지 모든 포인터형이 void*형으로 변환될 수 있고, 그 역으로 되돌아갈 수 있을 뿐입니다. 서로 다른 데이터형에 대한 포인터 사이의 변환 결과는 정의되어 있지 않습니다.
참고로 char*형과 그 호환형들도 void*형과 같은 내부표현과 정렬제한을 가지기에 역시 범용포인터로 사용될 수도 있습니다. (그러나 void*가 갖는 몇가지 편리한 특성을 갖지 않으므로 별로 권하고 싶지 않습니다)
특정 컴파일러에 대해서는 그렇게 구현되어 있을 수도 있습니다만, 모든 컴파일러에서 해당하는 것은 아닙니다. 위에서 말했듯이 struct message *형과 unsigned char*형이 서로 다른 정렬제한과 내부표현을 가질 수 있습니다. 간단하게 'struct message형이 저장된 메모리 공간을 가리킬 수 있는 포인터'와 'unsigned char형이 저장된 메모리 공간을 가리킬 수 있는 포인터'로 이해하시면 되겠습니다.
a가 저장된 위치의 주소값이 가리키는 메모리상의 한 지점을 unsigned char형으로 취급하여 접근하라는 뜻입니다. 아마도 message형 구조체 a를 바이트 단위로 직접 접근하려고 하는 수식인 듯 합니다.
이해를 돕기 위해 예를 하나 들겠습니다.
struct message a; 를 하게 되면 메모리상의 특정 지점에 sizeof(a) 크기 만큼의 메모리 공간을 차지하는 개체 a를 만들게 됩니다. 여기서는 a가 저장된 주소가 1037이라고 하지요. 우리가 개체 a에 접근한다는 것은 메모리의 1037번지부터 sizeof(a)만큼의 공간을 차지하고 있는 메모리 공간에 접근한다는 뜻입니다.
(unsigned char*)&a
라고 한다면, 메모리 1037번지부터 시작하는 sizeof(unsigned char)만큼의 크기를 가진 메모리 공간을 unsigned char형으로 취급하여 접근한다는 뜻입니다.
Re: 저 역시 포인터 질문이요... 좀 헷갈려서요...
어떻게 구현되었는지 빙글 돌아서 생각하기 보다는 단순하게 생각하세요. 말 그대로 입니다. struct message*는 struct message를 가르키는 것이고 unsigned char*는 unsigned char를 키는 그대로 입니다.
struct message*는 struct message형의 자료 하나를 가르키거나 struct message형의 배열이나 동적 할당된 자료의 첫번째를 가르키는데 쓰입니다. unsigned char*는 unsigned char형의 자료 하나를 가르키거나 배열이나 동적할당된 자료의 첫번째를 가르키는 것이구요.
어떤 자료를 담는 포인터에서 다른 포인터로 옮기는 행위는 같은 포인터 형끼리 옮기거나 다른 포인터에서 일반 포인터(void*)로 옮기는 정도만 정확한 것일테지만...
실제 컴파일러에서는 어느 정도 다른 포인터에서 다른 포인터로 옮겨가는 것을 허락한다고 알고 있습니다. 일반적으로 unsigned char*나 char*로 옮기는 것 정도는 하드웨어 적으로 가능하니깐 허용해주는 것이 많은데 하드웨어 적으로 그게 허용이 안되는 것도 있습니다.
- 죠커's blog / HanIRC:#CN
댓글 달기