개발/Algorithm

메모_

huiyu 2015. 4. 8. 11:41
[C] char *str와 char str[] 의 차이 C/C++

2014/06/06 15:54

복사 http://blog.naver.com/chhh92/220022245722

전용뷰어 보기

​char *str와 char str[]은 문자열을 담기위해 사용합니다. 용도는 같더라도 담는 방법이 다릅니다. 잘 알고 상황에 맞게 문자열을 담으면 되겠습니다. 

 

당연한 소리지만, char *str는 포인터고 char str[]는 배열입니다. 얼핏 보면 둘다 문자열을 담거나 작업할때 쓰여서 같아보일지라도, char *str도 char str[]처럼 "선언과 동시에 초기화"를 할 경우 확실하게 차이가 납니다.


우선 역할을 보면 char *str은 주소를 담고, char str[]은 값을 담습니다. 만약 선언과 동시에 초기화 할때 문자열 상수를 주어질때,


1
2
char *str1 = "hoochoona";
char str2[] = "hoochoona";


char *str1은 문자열 상수의 주소를 담게되고,

char str2[]은 문자열 값을 가져옵니다.

선언과 동시 초기화 할때 []는 오른쪽 값의 갯수를 세어 컴파일러가 알아서 배열 최대 개수를 적어줍니다.

때문에 이 두개를 sizeof로 출력하면 str1은 주소이므로 4바이트가, str2는 값의 길이를 출력합니다.


이 둘은 또 엄연히 차이가 있는데 str1은 문자열의 값을 바꿀수가 없고 str2는 값을 바꿀수 있습니다. str1은 문자열 상수의 주소를 받았으니까요.

때문에 초기화하는 문자열에 대해 앞으로 변경되면 안될 경우 char *str로 초기화를 하고 변경될 예정일 경우 char str[]로 선언하면 됩니다.


이 둘의 차이는 strtok을 사용해봐도 알 수 있습니다.


1
2
char *str1 = "a,b,c,d,e,f,g";
char str2[] = "a,b,c,d,e,f,g";


strtok은 문자열을 자르기위해 내부적으로 원본 문자열을 변경합니다. 때문에 strtok같은 경우 1번째 줄로 선언해서 파라미터로 넘겨줄 경우 에러를 발생합니다.

 
728x90
반응형