10주차 강의 정리(이경훈) - aksrud/3kingOfGod GitHub Wiki
주소의 연산 (지난 주 정리)
주소의 연산이란 주소에 정수를 가감산 하는 것으로 그 주소의 자료형의 크기만큼 가감산 되는 것이다.
7주차 강의정리에도 말했듯이 아래의 표현식은 동치이다 주소[i] == *(주소+i)
문자 & 문자열
문자 인코딩(Encoding)
'A' - 65 이런식으로 문자를 컴퓨터가 이해할수 있는 숫자로 바꿔주는 것
문자 집합
ASCII(미국 정보 교환 표준 부호)
아스키는 영문자, 숫자, 기호, 제어문자 등등을 포함한 문자들을 0 ~ 127까지의 수로 매핑 되어있는 표로 8비트 중 7비트가 쓰인다. (7비트 표현 가능 0을 포함한 양수 == 0 ~ 127) 그래서 여기서 문자의 크기를 물어본다면 1byte즉 1bit라 할 수 있다.
나머지 1비트는 패리티 비트로 시리얼 통신(하나 하나씩 보냄)에서 오류를 검출할 때 쓰인다. 홀수, 짝수 패리티 : 전체 비트의 1의 갯수가 홀수 또는 짝수에 맞춰서 정함. ex.) 'A' == 0(패리티 비트) 100 0001(실제 데이터)
아스키는 인코딩 방식이 하나로 ascii에 있는 맵핑이 되어있는 그대로 인코딩이 된다.
UNICODE(전세계 표준 문자 집합)
- 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다.
- 유니코드는 아스키와 호환성을 위해 아스키가 사용하는 0~127까지는 동일하게 되어있으며 그 후 부터 추가가 되어 있다.
- 유니코드는 특별하게 한글 조합을 이용할수 있는데 방법은 유니코드값 = 44032 + 초성번호 * 21 * 28 + 중성번호 * 28 + 종성번호 으로 이것으로 한글을 조합하거나 분해 할 수가 있다. (초성과 중성이 둘다 28이 곱해져 있는 것은 분해 때문)
유니코드 인코딩 방식
- UTF-8 : 가변 길이 인코딩 방식으로 1~4 바이트로 맵핑되며 웹에서 기본적으로 널리 사용되는 인코딩 방식이며 한글은 3바이트로 인코딩된다.
- UTF-16 : 가변 길이 인코딩 방식으로 2,4바이트로 맵핑되며 window나 대부분의 프로그래밍 언어에서 쓰이며 대부분 한글을 포함해 2바이트로 표현된다 그 이외는 4바이트.
- UTF-32 : 4바이트로 고정된 인코딩 방식으로 단순하게 모든 문자를 4바이트로 유니코드에 있는 것을 그대로 인코딩 한다.
문자열와 문자 차이
""로 감싸져 있으면 문자열 취급이다. ''로 감싸져 있으면 문자 취급이다
문자열 리터럴
문자열 리터럴이란 프로그램 소스 안에서 ""에 묶인 문자열 상수이다. 이 때문에 C++에선 상수 문자 포인터로 저장하지만 c는 그냥 문자 포인터로 저장한다. 하지만 리터럴은 메모리 구조로 보면 데이터 영역에 읽기 전용 데이터 영역(rodata) readonly로 들어가 값은 변경을 못 한다.
문자열 저장 방식
- 길이(문자열 길이), 문자열
- 문자열 + 끝 표시 (\0 널 문자) c언어 이 방식으로는 문자열을 널 문자를 끝으로 인식하여 저장한다. 그러므로 c언어에서 문자열의 크기는 문자 갯수 + 널 문자 1개 이다.
문자열 주소 이용
문자열은 그 문자열이 저장되어있는 주소의 시작 주소를 반환하기 때문에 그걸 이용한다. 출력할 때는 %s를 포맷 팅 문자로 넣어서 널문자(\0)가 있는 곳까지 출력된다.
문자열 저장 방법
포인터
자료형이 char*인 방식으로 포인터를 생성하여 문자열의 주소를 저장한다.
배열
배열은 길이를 미리 정해줘야 하기 때문에 문자열의 길이를 추정해야 되는데 c언어에선 문자열의 길이가 +1 이므로 문자열의 길이가 n이면 char arr[n+1] = ""(실제 코드는 초기화를 상수로 함 예시일 뿐) 이런 식으로 저장한다.