해당 포스팅은 Char * 와 Char [] 간의 비교 및 난해함에 관해서 설명한다.
초보자에게 유용한 글이 될 것이다.
1. 굳이 필요한가.
C++ 11 이상을 주로 사용하는 사람들은 보통 std::string 과 같은 string 형식을 많이 사용하지
char * 나 char [] 은 주로 사용하지 않을것이다.
때문에 char 에 대한 필요성도 그다지 느끼지 못할 것이고, 추상적으로만 개념을 잡아두었을 가능성이 매우 높다.
하지만 char *, char [] 와 std::string 은 매우 다른 형태라는점을 인지 하여야 한다.
std::string 은 그 가변성으로 인해 사용하기 매우 편리하지만,
네트워크 송수신 용도로 사용하는 용도 등에서는 반드시 char[] 가 사용될 수 밖에 없다.
때문에 std::string 만이 아닌 char *, char[] 에 대해 학습해 두는것은 필수적인 과정이라 할 수 있다.
2. char *, char []
#include <iostream>
int main()
{
char* a = new char [5] { 1, 2, 3, 4, 5 };
std::cout << a << std::endl;
std::cout << *a << std::endl;
std::cout << &a << std::endl;
}
위와 같은 예제코드가 있다면 결과물은 아래와 같을 것이다.
우선 첫 프린트에서
☺☻♥♦♣
가 아닌 여러 글자가 뒤에 따라나오는것은 '\0' 메시지가 없기 때문이다.
여기서 한가지를 더 강조하고 넘어가고 싶은데,
컴퓨터 프로그래밍에서는 모든것이 바이트 기준으로 이루워 져 있다는 것이다.
그 중에서 char 형은 기본중의 기본으로
char[] 에서 끝나는 지점이 어디인가 명시('\0') 하지 않았다면,
해당 주소로부터 '\0' 를 만나기 전까지 계속 출력된다.
때문에 첫 프린트문에서 ☺☻♥♦♣ 뒤에 인식되지 않은 문자들이 출력 되었던 것이다.
만약 저 다섯글자만 출력되게 하고 싶다면
char* a = new char [6] { 1, 2, 3, 4, 5, '\0'};
와 같이 변수를 할당해 주면 된다.
계속해서 char * 와 char [] 의 관계에 대해 설명하자면,
위 그림을 보면 char * 와 char [] 가 어떤 관계속에 있는지 쉽게 식별이 가능하다.
char* a = new char [5] { 1, 2, 3, 4, 5 };
char *a 는 char [5] 의 시작점 주소값만을 가지고 있을 뿐이며,
std::cout << a << std::end;
를 입력시 a 포인터값을 순서대로 하여 '\0' 값을 만날때 까지 loop 하며 출력하는 것이다.
그리고 이미지를 보면 알겠지만 다른 포인터로 해당 주소를 참조할 수도 있다.
다른 포인터를 만들어서 주소를 참조한 것이므로 내부 공간에 참조하는 주소가 위치하고 있음을 명심해야한다.
#include <iostream>
int main()
{
char* a = new char [6] { 1, 2, 3, 4, 5, '\0'};
std::cout << a << std::endl;
std::cout << *a << std::endl;
std::cout << &a << std::endl;
char** b = &a;
char*** c = &b;
std::cout << &b << std::endl;
std::cout << **b << std::endl;
std::cout << &c << std::endl;
std::cout << ***c << std::endl;
}
3. 그래서 뭐? 이거 초보자 아니면 다 아는거 아님??
물론 나도 어느정도 알고는 있었지만,
실제로 char * 형을 많이 다뤄보지 않아서,
파생된 함수들을 이용할때 이 점이 문제가 된다는 사실을 인지하지 못했다.
대표적으론 strcmp 가 있다.
'Programming > C++' 카테고리의 다른 글
[C++] 리스트 inverting 체인연산 (0) | 2022.10.24 |
---|---|
C# C++ 간 이벤트 발생시키기. (0) | 2022.06.03 |
[C++] std::thread 를 멈추는 방법 (0) | 2021.09.18 |
[C++] std::thread vs std::async (0) | 2021.09.17 |
[C++] 동적 라이브러리 vs 정적 라이브러리 개인 의견 (0) | 2021.08.22 |