티스토리 뷰
3. 문자열
문자열은 문자의 배열이고, 배열 마지막에는 문자열의 끝을 나타내는 \0(null 종단 문자)이 저장된다. 문자열을 출력하기 위해서는 포인터(*)를 사용해야 한다. char형 배열의 이름은 결국 문자열을 가리키는 포인터가 된다.
말하자면 C언어에서는 string을 char *이라고 말한다고 볼 수 있다.
#include <stdio.h>
int main(void){
char *str = "Hello World";
printf("%s\n", str);
return 0;
}
4. 문자열 비교
문자의 배열의 이름은 문자열을 가리키는 포인터인데, 더 상세하게 말하면 배열에 저장된 첫 번째 문자를 가리킨다. 배열에 저장된 문자 하나하나의 주소를 확인해보자.
#include <stdio.h>
int main(void)
{
char *s = "hello";
printf("%s\n", s);
printf("%p\n", s);
printf("%p\n", &s[0]);
printf("%p\n", &s[1]);
printf("%p\n", &s[2]);
printf("%p\n", &s[3]);
printf("%p\n", &s[4]);
}
배열에 저장된 문자마다의 주소를 확인해보면, 배열명으로 확인한 주소와 배열에 저장된 첫 번째 문자의 주소가 동일함을 확인할 수 있다. 그리고 배열에 저장된 문자의 주소가 1씩 증가하고 있음을 알 수 있다. 그러므로 아래와 같은 방법으로 배열에 저장된 문자열을 출력할 수 도 있다.
#include <stdio.h>
int main(void)
{
char *s = "hello";
printf("%c", *s);
printf("%c", *(s+1));
printf("%c", *(s+2));
printf("%c", *(s+3));
printf("%c", *(s+4));
}
그리고 문자열의 경우 비교연산자는 문자열이 저장된 주소를 비교하기 때문에, 비교 연산자를 사용해 문자열을 비교할 수 없다.
5. 문자열 복사
문자열은 비교 시에도 저장된 주소를 비교하고, 대입 연산자를 사용해도 주소값을 저장하기 때문에, 두 개의 문자열을 실제로 메모리상에서 복사하려면 <string.h> 헤더 파일의 strcpy()를 사용해야 한다.
혹은 <stdlib.h> 헤더 파일의 동적 메모리 할당 함수 malloc()을 사용해 임시로 메모리를 할당받아 저장할 수도 있다.
동적 메모리
✔ 동적 메모리 (Dynamic Memory Allocation) : 메모리의 유연한 관리
✔ 동적 메모리 할당 : 프로그램 실행 도중, 동적으로 메모리를 할당받는 것
✔ 프로그램에서는 필요한 만큼의 메모리를 시스템으로부터 포인터에 할당받아 사용하고
✔ 사용이 끝나면 시스템에 free( )을 사용해 명시적으로 메모리를 반납하므로 메모리를 효율적으로 사용할 수 있다
#include <stdio.h>
#include <stdlib.h>
int main(void){
int *p;
p = (int *)malloc(sizeof(int));
//동적 메모리 사용하기
*p = 100;
printf("%d\n", *p);
/*동적 메모리 사용 후 반환하기*/
free(p);
return 0;
}
✔ malloc( sizeof(int) ) = int타입의 크기만큼 메모리를 할당 (int = 4바이트 → pi에 4바이트 할당)
✔ malloc함수는 void* 을 반환하고 malloc을 사용해 동적 메모리를 할당하는 주소는 void가 아니므로, 형 변환이 필요하다(int *)
✔ malloc함수를 사용할 때마다 형 변환을 계속하는 것은 불편하기 때문에 이제는 형 변환을 생략해도 오류가 발생하지는 않는다
✔ 하지만 명시적으로 형 변환하는 것을 추천
<string.h>
✔ strlen( ) : 문자열의 길이를 확인하는 메서드
✔ strcmp( str1, str2 ) : 두 가지 문자의 사전적 순서를 비교하는 메서드
✔ strcpy( str1, str2 ) : str2의 문자열을 복사해 str1에 저장하는 메서드 → 문자열을 저장할 때 주로 사용
✔ strcat( str1, str2 ) : 두 개의 문자열을 붙임
✔ strstr( str1, str2 ) : 두 개의 문자열을 인자로 받아 첫 번째 문자열 내부에 두 번째 문자열이 나오는지 탐색
[출처] 부스트코스 | 모두를 위한 컴퓨터 과학(CS50 2019)
'Computer Science > CS50' 카테고리의 다른 글
[CS50 5주차] 7. 메모리 교환, 스택, 힙 (0) | 2021.02.14 |
---|---|
[CS50 5주차] 6. 메모리 할당과 해제 (0) | 2021.02.12 |
[CS50 5주차] 2. 포인터 (0) | 2021.02.12 |
[CS50 5주차] 1. 메모리 주소 (0) | 2021.02.12 |
[CS50 4주차] 알고리즘 (0) | 2021.02.12 |