문자열은 C언어에서는 문자 배열이라고 생각하면 된다...

문자열은 여러가지 특징이 있는데, 그 것을 알아보자...

그전에 상수에 값이 들어가는 것에 대해 한번 알아보자...

a , 'a', "a" 이 3 가지의 상수가 있다고 봤을 때.. 이 것들은 모두 다르다..

a 같은 경우는 그냥 일반적인 상수라고 보면된다...

흔히, int a = 4 ; 에서 4 같이 그냥 숫자를 바로 넣는 형태이다...

'a' 는 하나의 문자 상수이다..

'a' 자체가 저장되기 때문에..

char a = 'a' ; 같이 쓸 수 있다...

그럼 내부 적으로는 char a 안에 아스키코드 형태로 97로 저장된다..

( a를 %d로 출력 하면 97이 나오고, %c로 출력하면 a 가 나오는 식이다.)

그럼 마지막으로 "a" 가 바로.. 문자열 형태이다...

단지 따옴표가 붙었을 뿐이지만.. 그 상태로 char* a ; 에 저장을 시키면..

문자열 형태로 저장된다.. ( 즉, char*가 아니라 char면 에러를 일으킨다. )

문자열 이라는 말은 제일 마지막에 /0 (NULL 문자 ) 가 들어가 있는 형태이다.

문자열을 넣을 때 우리는 ..

char* string = "Hello world" ;

이렇게 값을 넣으면 된다...

이러면 자동적으로 마지막에 널이 들어가 있다.

이 것을 메모리 상에서 보면.. string 이라는 포인터 변수가 잡히고,

그 포인터 변수가 가르키는 주소값이 바로.. Hello 의 H의 위치이다..

이 문자열의 주소 위치는 컴파일러가 알아서 저장한다..

그럼 문자열의 출력 방법을 알아보자...

printf("%s\n", string ) ;

printf( string ) ;

puts( string ) ;

이렇게 여러가지가 있는데... 단순 출력만을 한다면..

그냥 puts가 가장 가볍고 좋다..

또 배열처럼 string + 2 라고 쓰면 string 위치부터 + 2 주소값이 더해져서..

Hello의 첫번째 l 을 가리키게 되며, 그 값부터 널을 만나기 전까지 출력이 된다.

그렇다면

char *string ;

char string[] ;

의 차이점은 무엇일까??

쉽게 생각하면.. 같은 행동을 하고, 출력 하기 위한 방식도 똑같고, 각 변수명이

문자열의 첫 주소를 가진다...

하지만 이 2가지는 엄연히 다르다...

위의 *string 같은 경우는.. 포인터 변수로, 따로 포인터 변수의 4바이트 주소를

가지고, 그 주소에서 문자열의 첫 시작점의 주소를 가리킨다..

하지만 2번째 의 경우는 문자열 배열로써...

그냥 문자열의 첫번째 위치를 바로 가리키고 있다...

이 것이 가장큰 차이점이다..

그래서 string++ 을 하면 문자열의 다음 변수를 가리킬 수 있지만,

아래의 배열일 때 ,

string++을 하면 에러가 난다..

왜냐하면 string 자체는 배열명이기 때문에.. 주소값을 가지고는 있지만..

++ 연산자를 풀어보면, string = string + 1 ; 과 같은데,

배열명에는 값을 넣을 수는 없기 때문이다..

그리고 char* string = "Hello" ; 의 Hello는 문자열 상수라고 보면된다..

상수는 즉, 고유한 하나의 값이다... 1이 1이지 0이 아닌 것처럼...

그래서,

*string = 'A' ;

이렇게 값을 넣으려 그러면.. 에러가 난다...

포인터 변수가 가리키는 첫 주소값의 내용을 바꿀 수 있을 것 같지만,

그 것은 불가능하다..

하지만 반대로

char string[] = "Hello" ;

이런 배열 형태로 저장되어 있다면,

string[0]  = 'A' ; 처럼 쓰는 것은 또 가능하다 ...

문자열... 간단히 쓰고있지만, 내부적으로의 흐름을 알아야...

나중에 헷갈리지 않고 잘 쓸 수 있을 것이다...
Posted by 바람처럼..
|