안녕하세요!
"프로그래밍 면접 이렇게 준비한다." 책을 보면서 공부하고 있는 컴퓨터공학과 4학년 학생입니다.
문자열에 들어있는 단어들의 순서를 반대로 출력해주는 함수를 작성하기 위해
함수의 파라미터로 문자열(char *)을 받도록 작성한뒤
실제로 char형 포인터 변수를 넘겨서 값을 바꾸려고 시도하였으나 에러가 발생하였습니다.
저는 문자형 포인터(char *)를 함수에 넘겼기 때문에 당연히 함수 안에서 그 포인터가 가리키는 곳의 값,
즉 문자열 값을 바꿀 수 있다고 생각했는데 바뀌지 않더군요..
그래서 아래처럼 테스트 코드를 만들고 실행해보았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> void func(char * str) { str[0] = 'A'; } int main() { char str1[] = "Hello World!\n"; char * str2 = "Hello World!\n"; func( str1 ); func( str2 ); // 에러 return 0; } |
main 함수 안에서 두개의 문자열을 만들었습니다.
하는 10번째 줄 처럼 배열의 형태로 선언하였고,
또 하나는 11번째 줄 처럼 char * 형으로 선언하였습니다.
그리고 그 두 문자열을 같은 함수에 넘겨보았습니다.
그랬더니 13번째 줄처럼 배열의 형태인 str1[] 을 넘겼을때는 함수안에서 값을 변경할 수 있었지만
14번째 줄처럼 char * 타입을 넘겼을때는 문자열의 값을 변경하려고 하자 에러가 발생하였습니다.
C언어에서 문자열은 곧 문자의 배열이고, 배열도 문자열의 처음 위치를 가리키는 포인터이기 때문에
두 표현이 같다고 생각했는데 이런데서 차이점이 있었네요..
두 표현이 정확히 어떤 차이가 있는지 궁금합니다.