으악 머리가 터질거 같네요...
이런 두근 거림... 머리가 터질거 같은데 두근거림...
언어를 하나 완벽하게 습득한다는 것은 무슨 느낌일까요...
이렇게 포스팅도 하면서 그럴 날이 찾아온다면 좋겠네요...
그러기 위한 과정이라 생각하고!
힘이 남아도는 삽잡이는 달리겠습니다! 쉬지않는 오토 마우스~!
#010 문자열(1) 에서는
배열과 포인터를 사용하며 주소의 연산을 가지고 놀았습니다...
놀았을까요, 끌려 다녔을까요... 하하...
1 2 3 4 | int* p = arr; &arr[0] = p; | cs |
음... 그러니까
문자열을 보면 메모리상에 연속적으로 저장을 시키고 맨 마지막에 \0을 자동으로 저장시킨다는 것~
실제 코딩에서는 어떻게 담아내는가 하냐면 말이죠...
1 2 3 4 | char* s = "ABC"; printf("%s\n", s); | cs |
첫번째, 왜 포인터변수 s인가...
왜냐하면, 지난 시간에 주구장장 얘기했던 것들에 의해서인데요...
연속되는 데이터들의 집합....
'ABC\0' 연속되는 데이터죠...
이들은 시작주소만을 알면 그 외에 다른 주소들은 문제 없이 찾을 수 있다고 했었습니다.
그렇다면 그 강좌를 생각해보며,
위의 문장은 문자열의 시작주소를 char형 포인터 변수 s에 담겠다라는 뜻으로 해석이 가능합니다.
사실은, char형 포인터에 문자열을 담을 수 있다라고 하지만
진짜로는 시작주소를 가리키는 것 뿐이죠...
두번째, 왜 char형으로 받는 것인가...
int형 같은 경우에는 하나 증가하면 4 byte가 증가하기때문에...
연속되게 데이터를 담을 수 없습니다...
그리하여 문자열을 나타내는데는 오직 char 포인터만을 사용합니다!
그리고 그 위의 코드를 보면 말입니다....
%s를 사용하여 문자열을 출력하고 있습니다.
네 맞습니다. 문자열에는 '%s'를 사용합니다. 정말 중요합니다. 너무너무 중요합니다.
%s 요놈은 '시작주소부터 알아서 내가 \0 만날때까지 출력해줄께'
이런 행위를 해주는 친구입니다.
여기서 중요한 것은 '%s' 이 친구는 시작 주소부터 출력해준다는 것입니다.
주소... 주소입니다... 주소...
1 2 3 4 5 6 7 | char* s = "ABC"+1; printf("%s\n", s); printf("%s\n", "ABC"); printf("%s\n", "ABC"+1); | cs |
문자열의 시작 주소를 가리킨다고 했습니다.
그렇다면 현재 포인터 변수 s에는 '주소' + '1'의 형태로써 1 byte를 건너 뛰었겠습니다.
따라서 s에는 "BC"가 저장되어 있다는 것이죠.
그렇다면 그 아래 세가지의 출력은 어떻게 될까요? 생각해 보시죠...
첫번째, s에는 현재 위와 같이 B의 주소를 가리키고 있기 때문에 "BC"가 출력이 될 것이고,
두번째, "ABC"의 경우 시작주소인 A를 가리키고 있을 터이니 "ABC"가 출력될 것입니다.
세번째, "ABC"+1은 위에서 설명한대로 "BC"가 출력되겠군요.
참고로 문자를 출력해주는 '%c'는 문자열에 사용해서는 안됩니다.
왜냐하면 문자열은 시작하는 주소를 담고 있는데, 문자를 출력하려 하니 제대로 실행이 될 수가 없습니다.
자... 잘들 보고 계신가요... ㅠㅠ... 허허...
다음으로, 문자열을 다루는 방법에 대해서 알아보고자 합니다.
문자열을 다루는데는 크게 두가지의 방법이 있습니다.
첫번째, 문자열의 시작 주소를 가리키는 포인터를 사용하는 방법 (위에서 사용했죠)
두번쨰, 배열을 사용하는 방법입니다.
배열은 연속되는 데이터를 담습니다.
포인터는 가리키고, 배열은 담고... 약간의 차이가 있습니다...
아무튼... 아래의 코드를 보시죠...
1 2 3 4 5 6 7 8 9 | char arr[5] = {'A', 'B', 'C', 'D'}; //char arr[5] = "ABCD"; // 위와 동일한 문장. printf("%s\n", arr); // 배열의 이름은 배열의 시작주소이자 문자열의 시작 printf("%s\n", &arr[0]); printf("%s\n", arr+1); // B의 시작주소를 알려준것. printf("%s\n", &arr[1]); | cs |
또한,
포인터로 다루는 문자열의 경우, 포인터이기에 size가 4바이트로 고정되어있습니다.
하지만, 배열로 다루는 문자열의 경우, 문자열의 길이에 다라 size가 변경되죠.
이로써 문자열에 대해 다는 아니지만
알아볼 것들에 대해서는 많이 알아본 것 같습니다...
삽잡이는 계속 달립니다.
푸하하
'삽질의 현장 > - C' 카테고리의 다른 글
곱씹어보자 C!_#013_ 삽잡이의 두서없이 막말하는 함수(2) (0) | 2015.06.25 |
---|---|
곱씹어보자 C!_#012_ 삽잡이의 두서없이 막말하는 함수(1) (0) | 2015.06.25 |
곱씹어보자 C!_#010_ 삽잡이의 두서없이 막말하는 문자열(1) (0) | 2015.06.24 |
곱씹어보자 C!_#009_ 삽잡이의 두서없이 막말하는 아스키코드 (0) | 2015.06.24 |
곱씹어보자 C!_#008_ 삽잡이의 두서없이 막말하는 C언어의 꽃! 포인터 (0) | 2015.06.23 |