2025. 4. 9. 22:52ㆍProgramming Language/C++
1. 문자열의 이름과 포인터
이전에 배웠던 배열의 경우는 배열의 이름은 배열의 첫번째 요소의 주소값을 반환했었는데 문자열 또한 마찬가지이다.
이렇게 사용이 가능하다.
조금 다른 점은 배열의 경우는 std::cout에 넣었을 경우 주소값을 반환했으나 문자열의 경우는 값을 반환한다는 점이다.
이는 std::cout << 연산자를 오버로딩 해서 문자열의 경우는 내용을 보여주도록 만들어져 있기 때문이다.
2. 문자열 리터럴과 포인터
이전에 정수 리터럴은 포인터에 직접 넣을 수 없었으나 문자열 리터럴의 경우는 직접 포인터에 넣는 것이 가능하다.
물론 그렇게 넣기 위해서는 해당 값이 변경되지 않도록(상수이기 때문에) const를 넣어 sptr을 사용해서 값을 변경할 수 없도록 해줘야 사용이 가능하긴하다.
이게 가능한 이유는 정수 리터럴과 문자열 리터럴의 처리 방식에서 있다.
정수 리터럴의 경우는
int num = 10;
위와 같이 선언되었을때 먼저 컴파일 타임에 10을 단순히 숫자 값으로 처리한다.
이는 따로 메모리 공간에 저장하지는 않는다는 것으로 이런 값들을 즉시값(Immediate Value)라고 한다.
이는 위 값을 컴파일러에서 해석할때 메모리에 얹은 후에 그 주소를 주는게 아니라
mov eax, 10 ; eax 레지스터에 숫자 10을 바로 넣음
mov [num], eax ; 그 값을 num이라는 메모리 공간에 저장
이런식으로 기계어로 만들었을때 그 값을 그대로 사용한다는 것이다.
반면 문자열의 경우는
char* str = "hello";
이런 코드가 있을때 컴파일러가 읽어서 기계어로 만들때
// - 메모리에 저장
.rodata:
0x1000: 'h'
0x1001: 'e'
0x1002: 'l'
0x1003: 'l'
0x1004: 'o'
0x1005: '\0'
.text:
lea rax, [rip + offset_to_hello] ; 문자열 주소 로드
mov [str], rax ; 포인터 변수에 저장
이런식으로 메모리에 저장을 한 후에 그 주소값을 반환해서 저장하는 형식으로 진행된다.
그렇기에 정수 리터럴과는 다르게 문자 리터럴의 경우는 char형 포인터에 직접 상수로 저장이 가능하게 된다.
물론 수정하지 못하게 const를 선언해준다는 가정하에...
3. 문자열 포인터의 사용
문자열 포인터의 경우는 기존에 배열 포인터에서 사용하던 방식은 대부분 사용이 가능하다.
추가적으로 문자열에서 사용하던 함수(std::strlen(), std:: strcpy(), std:: strcmp()등..)도 그대로 사용이 가능하다.
1) std::strlen() - 문자열의 길이 출력
2) std::strcpy(a, b) - 문자열의 복사(b의 문자열을 a로 복사한다.)
3) std:strcmp(a, b) - 문자열의 비교(a와 b를 비교했을때 a의 길이가 b보다 길면 1, 같으면 0, 작으면 -1을 반환한다)
'Programming Language > C++' 카테고리의 다른 글
Ch 07. 포인터 - 05. nullptr (0) | 2025.04.15 |
---|---|
Ch07. 포인터 - 04.동적 할당 (0) | 2025.04.10 |
Ch07. 포인터 - 02. 배열과의 관계 (0) | 2025.04.09 |
Ch07. 포인터 - 01. 포인터의 기본 (0) | 2025.04.08 |
Ch06. 복합데이터 - 09. Range-based for (0) | 2025.04.08 |