a, 'a', "a" 의 차이
a 는 변수입니다.
a 라는 변수는 형에 따라서 다양한 값을 입력시킬 수 있습니다.
int a; a = 5; a = 'a'; a = '7';
'a' 는 문자 상수입니다. 상수이기 때문에 'a' 는 변하지 않습니다.
시스템 내부적으로 'a' 는 ASCII 수치로 변환되어 처리됩니다. ( 'a' 의 ASCII 의 값은 97 입니다. )
"a" 는 문자열 입니다.
문자열은 반드시 널 문자로 끝나도록 정해져 있으므로 "a" 도 역시 '\0' 를 포함하고 있습니다.
문자열 포인터 변수
문자열 포인터 변수는 포인터 변수이기 때문에 변수에 저장되는 값은 주소가 됩니다.
이 주소가 가리키는 대상체가 문자열일 때 이것을 문자열 포인터 변수라고 지칭합니다.
정확히는 문자열이 저장된 곳의 가장 첫번째 문자의 위치를 가리킵니다.
char *str; str = "mozi";
str 에 'm' 가 저장되는 과정을 그림으로 나타냈습니다.
str 이라는 변수가 할당(4 byte) 되고 "mozi" 를 위한 공간이 할당되며 'm' 이 위치한 주소를 str 이 가리키고 있습니다.
즉, str 에는 'm' 이 저장된 곳의 주소가 할당됩니다.
포인터를 이용한 문자열 조작
이전의 포인터와 관련된 포스팅을 보고나면 아래의 소스가 이해가 되실거라 믿습니다.
main() { char *str; str = "mozi"; pirintf("%c\n", *(str)); // m pirintf("%c\n", *(str + 1)); // o pirintf("%c\n", *(str + 2)); // z pirintf("%c\n", *(str + 3)); // i pirintf("%s\n", str); // mozi pirintf("%s\n", str + 1); // ozi puts(str) // mozi }
포인터에서 잠깐 일탈하면 printf 보다는 puts 가 메모리를 적게 잡아먹는 함수이기 때문에 가능하면 puts 를 애용합시다. :-)
착각하기 쉬운 첨자
포인터 변수를 쓰고 배열처럼 사용이 가능할까? 결론부터 말하면 가능합니다.
사실 배열은 아니지만 배열처럼 사용할 뿐입니다.
str[2] 는 배열이 아닙니다. 배열처럼 보일 뿐입니다.
str[2] 의 의미는 str 이 가리키는 번지에서 3번째 (0 부터 시작하므로) 문자를 지칭하고 기리키고 있는 곳의 값까지를 의미합니다.
main() { char *str; str = "mozi"; printf("%s\n", &str[2]); // zi }
결국 위의 의미는 아래와 다 동일합니다.
*(str + 2) == str[w] == *(2 + str) == 2[str]
*string 과 string[] 의 차이
아래 2개는 어떤 차이가 있을까?
차이를 설명할 수 있을까?
main() { char *str = "mozi"; char str2[] = "mozi"; }
차이를 그림으로 그려보면 다음과 같습니다.
주소값을 동일하게 쓰긴 했지만, 이 부분은 살짝 무시해주고 위의 메모리 구조와 아래의 메모리 구조를 보면 차이점이 느껴지실 겁니다.
위는, mozi 가 어딘가에 저장되고 'm' 의 주소가 str 에 할당됩니다. str 의 변수와 mozi 의 문자열은 별개로 존재합니다.
아래는, 배열입니다. mozi 라는 문자열이 str2 배열에 할당됩니다.
포인터 배열에 문자열 할당
포인터도 마찬가지로 배열이 될 수 있고, 이 배열에 문자열들을 넣을 수 있습니다.
무슨말이냐? 소스로 보겠습니다.
main() { char *str[2]; str[0] = "mozi"; str[1] = "tistory"; }
위의 소스를 메모리 구조로 그려보면 다음과 같습니다.
이렇게 써도 str[0] 과 str[1] 에는 의도하는 문자열이 들어가게 됩니다.
그러나 위와 차이점이 있습니다. 아래의 소스는 위의 소스보다 공간상에서 단점이 심한데요.
한 번 생각해 보도록 합시다.
main() { char str[2][10]; strcpy(str[0], "Mozi"); strcpy(str[1], "Tistory"); }
'Computer Language > C' 카테고리의 다른 글
[C] 2차원 배열과 포인터 학습하기 (0) | 2018.11.18 |
---|---|
[C] 1차원 배열과 포인터 학습하기 (0) | 2018.11.18 |
[C] 포인터란 무엇인가? (0) | 2018.11.16 |
[C] 스택 개념, 함수, 코드 정리 (0) | 2018.11.08 |
[C] 큐 개념, 종류 및 작동 방식, 코드 정리 (0) | 2018.11.08 |