일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Python
- 건대입구맛집
- FLUTTER
- 장고
- BeautifulSoup
- 상속
- removetooltip
- 자바
- 컴퓨터과학
- 성수동카페
- 추상클래스
- 노마드코더
- 포인터
- c언어문자열
- Django
- 남양주맛집
- DOM
- python3
- 알고리즘
- pipenv
- 속초여행
- 가상환경
- JavaScript
- 아스키코드
- popupmenubutton
- 부스트코스
- 강원도속초맛집
- 코딩독학
- 정렬알고리즘
- richtext
- Today
- Total
YUYANE
C / char 이용해서 문자열 선언하기 본문
학습 강의
www.boostcourse.org/cs112/lecture/119009
C언어에는 문자열을 저장하는 자료형인 string이 없다.
따라서 char 를 사용해서 문자열을 담아야 하는데, 두 가지 방법이 있다.
포인터를 사용하거나, 배열을 사용하거나
char *str = "There is no string";
char str_[] = "There is no string";
그런데 string이라는 개념은 존재한다.
printf 를 사용해서 출력을 하려면 다음과 같이 코드를 작성해야 한다.
printf("%s\n",str);
printf("%s\n",str_);
'%s' 대신에 '%c'를 다음과 같이 컴파일 오류가 난다.
포인터 vs [ ]
char *str 은 메모리 주소를 담고, char str_[]는 문자열 값을 가진다.
char *str 은 문자열의 값을 바꿀 수 없고, char str_[]는 문자열의 값을 바꿀 수 있다.
포인터
char 는 문자가 하나만 있는 변수이기 때문에 메모리 크기는 1바이트이다.
그런데 문자열의 크기는 1바이트를 넘어서니깐 변수에 직접 저장하는 대신 포인터를 이용해서 주소를 저장하는 것이다.
나중에 읽을 때 메모리 주소를 보고 문자열이 저장 된 위치로 이동한다.
문자열의 메모리 크기
기본 자료형들은 각각 차지하는 메모리 크기가 있다. 예를 들어 char 는 1바이트, int 는 4바이트 등
문자열의 메모리 크기는 어떻게 정해질까?문자열 안에 있는 문자(char)의 갯수에 비례해서 정해질 것이다.
그런데 일반 배열 자료형과 달리 추가로 1 바이트가 더 필요하다.
만약에 4개의 int 형 정수를 담은 배열이 있다면, 그 배열의 메모리 크기는 4 * 4 = 16바이트가 될 것이다.
반면에 char형 배열은 그 길이를 처음부터 정해주지 않기 때문에 메모리 크기가 얼마나 될 지 알 수 없다.
그래서 char형 배열은 문자열이 끝나면 추가로 '\0' 표시를 붙여서 문자열이 끝났다는 신호가 붙는다.
'\0'이 추가로 1 바이트가 더 필요한 이유이다.
위 이미지는 "Hi!"를 담은 변수의 메모리 구조를 보기 쉽게 나타낸 그림이다.
끝에 '\0'이 붙기 때문에 해당 변수가 차지하는 메모리 크기는 3바이트가 아니라 4바이트가 된다.
int main(void)
{
string names[4];
names[0] = "EMMA";
names[1] = "RODRIGO";
names[2] = "BRIAN";
names[3] = "DAVID";
printf("%s\n", names[0]);
printf("%c%c%c%c%i\n", names[0][0], names[0][1], names[0][2], names[0][3], names[0][4]);
}
다른 것은 무시하고, 맨 마지막 줄만 보자.
names[0] = "EMMA" 이기 때문에 names[0][4] = '\0'이 될 것이다.
즉, 문자열이 끝났음을 알리기 위한 다섯 번째 문자열의 값이 존재 하기 때문에 출력 결과는 다음과 같다.
(학습용으로 출력했을 뿐, 굳이 출력할 필요는 없다.)
참고 사이트
blog.naver.com/chhh92/220022245722
'Programming Languages > C' 카테고리의 다른 글
C / 컴파일 과정에 대해서 (0) | 2021.01.25 |
---|---|
C / 포인터 사용하기 (코드리뷰) (0) | 2021.01.22 |
C / 전역변수 사용이 나쁜 이유 (0) | 2021.01.22 |
C / 오버플로우 (0) | 2021.01.19 |
C / 컴파일러의 역할 (0) | 2021.01.18 |