널이 정수(혹은 문자)의 형태로 쓰일때의 널은 단순히 0이지만
문자열의 형태로 쓰일때는 0번지주소를 의미...
그러니까.. int a = 0; 에서 0은 0이지만
char * a = 0 에서 0은 0번지 주소를 의미..
그러니까 널이 숫자(문자)의 형태로 쓰일때와 문자열로 취급해서 쓰일때는 의미가 달라진다
하지만 널을 문자열로 취급해서 쓴다고 해서 널이 널문자열을 의미하는건 아니야
char * a = 0 ; 에서 a는 0번지 주소를 가지지만
char * a = ""; 에서 a는 임의의 주소에 들어있는 널문자열을 가리키니까
라고 생각해도 되려나..
좀더 정확히 말해 볼께. 1 이라는 것은 리터럴(literal) 이라고 하고, 이 1 이라는 리터럴이 int a = 1 형태로 사용되면 이제 1이라는 리터럴은 정수가 되는거고, int *p = 1 이라는 형태로 사용되면 이제 1 이라는 리터럴은 포인터 상수가 돼.
즉 1이라는게 정수도 될수 있고, 포인터상수도 될수 있는 복잡한 무언가 라기 보다는, 우리가 문자로 어떤 값을 표현하려다 보니 한계가 있기때문에, 어떤 형태로 사용되느냐에 따라 그 리터럴을 정수로 해석하거나 주소(포인터상수) 로 해석하기도 하지.
비슷하게 우리는 null pointer 상수가 필요하고 이걸 0 혹은 NULL 이라고 표현해. 포인터상수는 주소를 가르키는 변수가 아닌 고정된 숫자혹은 문자야.(배열명은 포인터 상수인데, 이거는 또 얘기가 길어지니 여기선 생략)
문자열의 끝을 표시하는 널 문자(null character) 는 \'\\0\' 라고 하고 1바이트짜리 문자이고, 실제값은 0 이야. 보통 이걸 널포인터(null pointer) 라고 하는 사람들이 있는데, 이건 틀린 표현이야. 둘다 똑같이 0으로 표현되기에 혼용해서 써도 상관없지만, 개념적으로 틀려.
컴파일러는..\"abc\" 라는 따옴표로 둘러싸여진 상수를 만나면 \'a\',\'b\',\'c\',\'\\0\' 으로 해석해. 디버그로 보면 0x95,0x96,0x97,0x0 이지.
따라서, 문자열의 끝을 가리키는건 null pointer 가 아니라 null charactor 야. 혼란스러워 해서는 안돼.
위에 설명한 \'a\',\'b\',\'c\' 에 대한 아스키 코드값으로 0x95,0x96,0x97 로 사용했는데, 아마 틀렸을듯. 감안해서 읽어.
\'\\0\'이 0x98주소가 아니라 0x0 주소인건 컴파일러 내에서 \'\\0\'에 대해 0번지에 이미 할당해놓고 필요할때마다 불러오기 때문?
0번지의 경우 시스템 영역이라 접근이 안되게 한다고 들은 것 같은데 그래서 0번지에 널을 할당해놓고 참조하려고 하면 널이 찍히게 하는건가
질문을 이해를 못하겠다. 0x0 은 값이야. \'\\0\' 과 같은값. printf (\"%d\", \'\\0\') 해봐 0을 찍을거야.
아 0x95, 0x96 ... 이 a,b에 대한 주소를 의미하는줄... 값이었구나
0번지를 어드레싱하면 하드웨어적으로 예외가 발생해. 운영체제는 이 예외처리 핸들러를 그때그때마다 적절한 에러메시지를 출력하도록 프로그래밍해둔거뿐이야.
위에 써 두었지만 , 아마 틀렸을거야. 괜한 혼란을 줄거 같으니..찾아봐야겠다. 잠시만.
위에꺼 잘못되었어. \'a\',\'b\',\'c\',\'\\0\' 은 97(0x61), 98(0x62), 99(0x63), 0(0x0) 이야. printf(\"%d, %d,%d\",\'a\',\'b\',\'c\')하면 97,98,99 가 찍힐거야.
설명 감사..