티스토리 뷰
우선 아스키 코드표를 보자
아스키 코드에 대해서 간단히 설명 하자면
ANSI에서 제정한 문자 코드 표 이며, 간단히 말하자면 1바이트로(8비트) 128개의 문자를 표현한것이다.
8비트는 2의8승개의 서로 다른 상태를 나타낼 수 있다. 그렇기 때문에 0~127까지의 숫자에 문자를 매핑 시킬 수 있는 것이다.
아스키 코드표에서 보면 0이라는 숫자에 '\0'이라는 문자가 매핑 되어있다.
'\0'이라는것이 바로 NUL이라는 문자다. (NULL이 아니다!! 둘은 다른것이다.)
NULL이라는 것은 숫자 0으로 #define 되어 있다.
즉 다시 말해서 c와 c++에서 NULL == 숫자 0 == '\0'는 동일한 의미로 쓰인다.
숫자 0과 문자 0 은 다르다
다시 표로 돌아가서 숫자 0~9와 문자 0~9가 다르다는것을 알 수 있을 것이다.
문자 0 은 아스키 코드표에서 48이라는 숫자를 의미한다.
char var = '0';
printf("%d",var); 을 하게되면 48이 출력 되게 된다.
숫자 0과 문자 0이 다르다는것을 알아야 한다.
어떤 문자열을 정의하면 그 문자열 맨 끝에 널문자가 1개 자동으로 붙습니다.
char str[]=“Hello World”;
str[5] = 0;
str[5] = ‘\0’;
Hello만 출력
('\0'이라는 NUL문자는 숫자 0을 의미하므로 둘은 같으며 c언어에서는 널문자가 문자열의 끝이라고 인식하기때문에 Hello만 출력 된다)
0과 '\0'과 NULL은 모두 같다
다만 0은 숫자이고 0의 아스키 문자값이 '\0' 인거고
NULL은 0으로 define된 매크로 상수이다
0과 NULL은 같지만 NULL에 의미를 부여해주기 위해 매크로로 따로 define 한것
문자열
널문자열은 값이 아무것도 들어있지 않은 빈 문자열을 의미한다.
C에서 문자열의 끝은 항상 널로 끝나야 하기 때문에 문자열의 값이라고 하면
널을 만나기 전까지의 문자들을 합쳐 문자열이라고 한다.
그러니까 값이 아무것도 들어있지 않은 빈 문자열은 널문자만 들어가 있는것을 의미한다
한편 값이 아무것도 들어있지 않다고 해서 크기가 없는 것은 아니다
널 문자를 저장하기 위한 공간도 할당되어야 하기 때문이다
즉 char* str= ""; 일때 str이 가리키는 주소는 뭘까?
""이 0을 의미 하기 때문에 8비트가 모두 0인 0x00 ( == 0000 0000)일까?
아니다. 사실은 '\0'이라는 NUL문자를 가리키는 포인터의 주소를 가지고 있다.
(문자열의 끝은 항상 '\0'으로 끝나야 하기때문에
아무것도 넣어주지 않았다고 하더라도 문자열이라는 특성을 유지하려면 '\0'은 항상 들어가야 한다.)
하지만 위의 예제에서 0을 %s로 출력한 것을 보자. 이때 숫자 0이란것은 아스키 코드로 NUL문자인 '\0'을 의미하며
그것은 다시 말하면 8비트가 모두 0(0x00)인 주소의 문자열을 출력 한다는 뜻이다.
0번지의 문자열을 출력하기 때문에 (null)이라는 것이 나오게 된것이다.
다시 말하지만 ""와 0번지의 주소를 %s로 출력 한 것은 분명히 다르다.
c언어 에서는 0번지 주소에 대한 어떠한 연산도 허용 하지 않도록 해놓았다. 즉 0번지주소는 아주 특별한 주소이다.
""의 주소는 0번지가 아닌 다른 번지의 주소에 할당 되어 있을 것이고, 그 주소는 NUL이라는 '\0'을 가리키고 있을 것이다.
'Computer > C' 카테고리의 다른 글
[C/C++] register int 와 int 의 수행속도 차이 비교 (1) | 2023.01.28 |
---|---|
[초급] 문자열비교 (0) | 2017.07.04 |
[초급] 문자열입력받기 (0) | 2017.07.04 |
[초급] 문자열 입력받고 하나씩 자르기 (3) | 2016.04.09 |
함수포인터 & 멤버함수 포인터 관련 (0) | 2015.09.02 |