|
안녕하세요. 먼저 첫번째 소스부터 보면...
char str[] 는 char *str 과 같습니다. str은 메모리상 "pointer are fun" 이라는 문자열이 있는곳의 주소를 가지고 있습니다. 정확히 말하면 문자열중 글자 'p' 의 위치입니다.
p는 (char *) 로 포인터지만 *p는 char형이 됩니다. char형에 str이라는 char * 포인터를 넣으려고 하니 오류가 나는 것입니다.
두번째 *p=M 에서 p는 포인터이며 *p 는 Integer가 됩니다. 따라서 *p=M 은 아무 문제 없습니다. 그러나 p=M 이라고 하게 되면 Integer형 M 을 포인터형에 넣으려고 하니 문제가 되는것입니다.
*p = M --> (Integer) = (Integer)
p = M --> (Pointer) = (Integer) -> Error
Pointer란것에 대해 좀 더 설명을 드리자면... 포인터는 주소값을 저장하기 때문에 크기는 항상 Integer형과 같은 크기 (도스에서는 16비트, 윈도우에서는 32비트) 를 가집니다. char * 나 int * 나 char, int에 관계없이 32비트 크기를 가지며 char나 int 를 붙여주는 것은 포인터 용도를 컴파일러에 알려주기 위함입니다. 예를 들어 char *p 로 정의한 p를 p++ 을 하게 되면 char형 포인터이므로 1 바이트만 증가하지만 int *p 로 정의한 p를 p++을 하게되면 integer형에 따라 p의 값이 4바이트 증가합니다.
char *c;
int *i;
int n = 0x12345678;
c = (char *) &n;
i = (int *) c;
printf("%d", *i);
이렇게 하면 n의 값 0x12345678이 전혀 손실없이 그대로 출력됩니다. 중간에 char 형 포인터로 형변환을 했지만 단지 포인터로서 char냐 int냐 상관없이 주소값이 그대로 전달되기 때문입니다.
오히려 더 혼란스러워지지 않았나 모르겠군요..ㅡ,.ㅡ 이해가 안가시는 부분이 있으면 다시 질문해 주세요~
아니면 다른분이 좀더 설명을 잘 달아드릴지도...^^:
이성근 님이 쓰신 글 :
: char str[]="pointer are fun";
: char *p;
: int i;
: p=str; // *p=str 이라고 하면 에러남
: for(i=0;p[i];i++)
: printf("%c",p[i]);
:
:
:
: int M[5]={3,6,9,12,15};
: int *p=M // int p=M 이라고 하면 에러남
: for(int i=0;i<5;i++)
: printf("%d",*(p+i));
:
: 위 두개는 각기 다른 소스입니다.
:
: 질문의 요지는 첫번째 소스에서는
: p=str 은 *p=str 은 에러가 납니다.
: 그런데 두번째 소스에서는 *p=M 가 성립이 됩니다.
: *p 뒤에는 값이 따른다는것으로 알고 있는데...
: 두 소스의 차이를 모르겠습니다
|