명시적 형변환이었나 그게 예를들면 (int)라는건 정수형으로 형변환을 하는 거잖아요?
동적 메모리 할당 함수 malloc은 void *malloc(unsigned int); 으로 정의되어있고
원하는 포인터 변수에 연결해 동적으로 메모리를 할당할 때 예를 들어 정수형이라 한다면
(int *)malloc(4); 라고 하잖아요.
여기서 그냥 궁금한게 (int) 와 (int *)의 표현의 차이는 무엇인가요
함수의 리턴값이나 원래 변수가 포인터형일 때 (int *)라고 해야만 에러가 안나는건가요?
만약 (int)*malloc(4); 라던가 실수형 포인터 변수 a를 (int)a라고 했을때 어떤 의미가 되는건지 궁금하네요..
추가로
int *pt;
pt = (int *)malloc(5*sizeof(int));
라고 하면 pt는 그냥 20바이트짜리 정수 하나를 가리키는 건가요?
int는 기본적으로 4바이트인데 malloc으로 저렇게 크게 잡으면 자동으로 배열이 되는건지 아님 다른 의미가 있는건지 모르겠네요..
혹여 지나가다가 아시는 고수분이 계시면 알기 쉽게 설명해주시면 감사하겠습니다 ㅠㅠ
아닐수도 있지만...
기본적으로 자료형을 표현할 때 Int 형식의 자료를 저장할수 있는 메모리 공간을 할당해서 사용할때 int a 뭐 이런식으로 선언해서 쓰게됩니다.
그럼 int *a 는 뭐냐.. 인데 이때의 *는 이 변수가 가지는 메모리 영역은 int형의 자료를 저장하기 위한 공간이 아니라 int형의 자료를 저장하는 공간의 메모리 주소를 저장하는 변수라는 의미입니다.
말로 풀어쓰니 좀 어려울 수도 있는데요...
메모리 공간에 어떤 데이터를 저장하기 위한 자료형을 설정하는 부분이
int 라던가, char라던가 라는게 있는거고
int * 라던가 char * 라는 자료형이 또 있다고 생각하시면 됩니다.
int는 정수를 담기 위해서 4바이트의 자료형을 Ansi C에서 사용하고 있고, char는 1바이트 데이터를 저장하기 위해 사용하고 있는데요.
*가 붙은 변수는 모두다 4바이트의 주소를 저장하기 위한 공간으로 사용됩니다.
(32비트에서 4바이트입니다. 64비트에서는 메모리 주소 크기가 커졌으니 8바이트를 사용하겠ㅤㅉㅛㅤ 'ㅅ'?... 8바이트가 맞나..... )
malloc 이라는 함수는 인자로 전달받은 크기만큼의 메모리 블럭의 주소를 반환하게 됩니다.
위에서 설명했듯이 모든 *변수는 동일한 크기니까 어떤 형태의 포인터 변수에 할당 할 수 있기 때문에 void *라는 형식을 쓰는겁니다.
여튼 int * 라는 자료형을 가진 포인터 변수는 int 를 저장하는 메모리 블럭을 가리키게 되므로 할당된 메모리 영역에서 4바이트(int의 크기)씩 연산하게 됩니다.
pt는 할당한 메모리의 오프셋0 부분이고, pt[0]과도 동일합니다. 물론 *pt와도 동일하죠.
그 다음의 pt[1]이나 *(pt+1)의 경우에는 실제 메모리 영역에서는 4바이트째인 오프셋 4부터라고 생각하시면 되는데요...
이게 글로만 설명하려고 하니... 굉장히 힘드네요 ㅠ_ㅠ)
더 이해가 안가시게 적은거 같기도하고...