포인터 문자열이 포인터 변수에 그 문자열 첫문자 주소값을 받는거라고 들었는데
char* string="hoho"
printf("%s",string);
printf("%s",*string);
왜 위에게 실행되고 밑에게 실행이 안되나요??
위에껀 주소값을 넣은거고 밑에꺼는 그 내용을 넣은거 같은데..
배열로 하면 밑에형식도 되던데 왜그런거죠? ㅠㅠ
char * strarr[3]={"aa","bb",cc"};
printf("%s\n",strarr[0]);
printf("%s\n",*strarr);
이건 둘다 aa 잘만뜨는데 왜 그런거죠? ㅠ
문자열(string) = "문자 배열(char array)"의 준말. C언어에서 문자열은 문자 배열의 시작을 가리키는 문자 포인터로 구현. 문자 배열의 끝은 '\0' (null character == (char)0)로 표현.
string으로 출력할 경우 "hoho"라는 문자 배열을 가리키는 포인터가 넘어왔으니 정상 동작하지만 *string은 'h'라는 문자 값을 넘겨주는데 printf 함수 내부에서는 이 'h'라는 아스키 코드 값을 문자가 아니라 문자열(문자 배열)의 메모리 위치로 판단해서 접근하려고 하는데 여기는 주소가 없는 곳이니까 오류가 나면서 프로그램 종료.
밑에서 strarr[0]과 *strarr는 같은 표현. arr[index]는 *(arr + index)의 신택스 슈거(syntactic sugar)야.
감사함미다..
첫번째 덧글에서 '' (null character) 에서 ''를 '\\0'으로 수정. 디씨 덧글에서 \\ 문자 필터링한다는 거 순간 깜빡함.
그것도 그렇고 그냥 형식지정자에 맞는 타입을 맞춰 써라.. printf는 가변인수함수라, 형식지정자에 맞춰 매개변수의 타입을 정하는데, 형식지정자는 %s로 해놓고 char타입을 매개변수로 줬으니.. 타입이 틀린데 왜 안되냐고 물어보면.