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(전세계 표준 문자 집합)

  1. 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다.
  2. 유니코드는 아스키와 호환성을 위해 아스키가 사용하는 0~127까지는 동일하게 되어있으며 그 후 부터 추가가 되어 있다.
  3. 유니코드는 특별하게 한글 조합을 이용할수 있는데 방법은 유니코드값 = 44032 + 초성번호 * 21 * 28 + 중성번호 * 28 + 종성번호 으로 이것으로 한글을 조합하거나 분해 할 수가 있다. (초성과 중성이 둘다 28이 곱해져 있는 것은 분해 때문)

유니코드 인코딩 방식

  • UTF-8 : 가변 길이 인코딩 방식으로 1~4 바이트로 맵핑되며 웹에서 기본적으로 널리 사용되는 인코딩 방식이며 한글은 3바이트로 인코딩된다.
  • UTF-16 : 가변 길이 인코딩 방식으로 2,4바이트로 맵핑되며 window나 대부분의 프로그래밍 언어에서 쓰이며 대부분 한글을 포함해 2바이트로 표현된다 그 이외는 4바이트.
  • UTF-32 : 4바이트로 고정된 인코딩 방식으로 단순하게 모든 문자를 4바이트로 유니코드에 있는 것을 그대로 인코딩 한다.

UTF-8 인코딩 방식 UTF-16 인코딩 방식

문자열와 문자 차이

""로 감싸져 있으면 문자열 취급이다. ''로 감싸져 있으면 문자 취급이다

문자열 리터럴

문자열 리터럴이란 프로그램 소스 안에서 ""에 묶인 문자열 상수이다. 이 때문에 C++에선 상수 문자 포인터로 저장하지만 c는 그냥 문자 포인터로 저장한다. 하지만 리터럴은 메모리 구조로 보면 데이터 영역에 읽기 전용 데이터 영역(rodata) readonly로 들어가 값은 변경을 못 한다.

문자열 저장 방식

  1. 길이(문자열 길이), 문자열
  2. 문자열 + 끝 표시 (\0 널 문자) c언어 이 방식으로는 문자열을 널 문자를 끝으로 인식하여 저장한다. 그러므로 c언어에서 문자열의 크기는 문자 갯수 + 널 문자 1개 이다.

문자열 주소 이용

문자열은 그 문자열이 저장되어있는 주소의 시작 주소를 반환하기 때문에 그걸 이용한다. 출력할 때는 %s를 포맷 팅 문자로 넣어서 널문자(\0)가 있는 곳까지 출력된다.

문자열 저장 방법

포인터

자료형이 char*인 방식으로 포인터를 생성하여 문자열의 주소를 저장한다.

배열

배열은 길이를 미리 정해줘야 하기 때문에 문자열의 길이를 추정해야 되는데 c언어에선 문자열의 길이가 +1 이므로 문자열의 길이가 n이면 char arr[n+1] = ""(실제 코드는 초기화를 상수로 함 예시일 뿐) 이런 식으로 저장한다.