[C] (char*) 의 의미
char* abc(){
static char bbb[30] = "hello";
return bbb;
}
int main(){
char *str;
str = abc();
printf("%s", str);
return 0;
}
아주 간단한 문자열이 담긴 배열을 돌려받는 함수를 만들어 보았다.
배열의 기초공부가 부족했다는 것을 느꼈다..
abc()에서 리턴하는것은 bbb 즉, &bbb[0]이다. bbb의 첫번째 배열의 주소이다.
그렇다면!! 리턴형이 포인터 *이네? *bbb이면 *&bbb[0]이므로 문자 하나를 리턴 하는거 아니야?!
str을 출력하면 h가 나와야 하는데?
뭔가 이상하다..?
그렇다. 반환형을 잘못 생각했다. (char*)bbb의 의미를 정확히 모르고 있던 것이다.
(char*)는 단순히 포인터 자료형이었던 것이다. 아무 영향도 못 미치는 자료형.
쉽게 말하자면 bbb는 배열이므로 배열을 포인터형에 넣기위해 형변환 해주는것과 비슷하다고 생각하면 된다
만약 리턴형이 char abc() 였다면? (char)bbb가 되므로 에러가 난다.
포인터형에는 포인터형에 맞게 넣어줘야한다. 우리가 메인문에서 무심코 배열 bbb를 str = bbb에 넣는것은
사실 (char *)bbb가 생략된 암시적 표현이다.
그렇다면 이건 어떤가?
int main(){
char bbb[30] = "abcd";
char *str = bbb; // 이것은 틀린걸까? 맞는 수식이다. (char*)bbb의 암시적 표현이다.
char *str = (char*)bbb; // 이것은 틀린걸까? 맞는 수식이다. 이것이 제대로된 명시적 표현이다.
return 0;
}
------------------------------------
배열이 아니라 변수일땐?
int main(){
int a = 10;
int *pt = &a; // 암시적 표현
int *pt = (int *)&a; // 명시적 표현
return 0;
}
※ (char *)는 단순한 자료형이다.