|
김인구.구야 님이 쓰신 글 :
: 일반적인 배열의 정의 : 연속된 공간에 할당된 동일 자료형의 집합
: C 에서의 배열의 정의 : int a[5]; => int형 기억장소 5개를 연속적으로 확보하고
: 그것의 '시작주소'를 a 라는 '상수 성격'의 이름을 부여하여 관리
:
: C의 관점에서 본 a[3] 과 *(a+3)
: C는 a[3]을 *(a+3)으로 바꿔서 컴파일 한다고 합니다.
: 첨자가 1부터 시작하는 언어에서는 a[3]을 "a 배열의 3번째 방"이라고 해석하고(원래 뜻 그대로)
: 베이스가 0부터인 C는 a[3]을 *(a+3)으로 바꾸고 "a주소에서 3만큼 떨어진 주소의 방"이라고 해석을 합니다.
: 베이스가 1부터인 언어에서 a는 배열 전체를 의미합니다.
: 하지만 C에서 a는 배열 전체를 의미하는게 아니라 그 배열이 시작되는 주소를 의미합니다.
: 베이스가 1인 언어에서는 a[-1] 이나 a[9]를 "a배열의 -1번째 방, a배열의 9번째 방"이라고 해석을하니까
: 당연히 a라는 배열에 없는 방이니 컴파일 에러가 난다고 합니다.(제가 다른 언어를 확인은 못해봤습니다.)
: 그러나 C에서는 "a주소에서 -1만큼 떨어진 주소의 방, a주소에서 +9만큼 떨어진 주소의 방"으로 해석을
: 하고 거기에 메모리(주소)가 있으니 컴파일 에러를 낼 이유가 없는것이죠.
: 물론 나중에 문제가 생기는건 프로그래머가 책임을 지라고 하는게 C언어구요.
: C 배열의 첨자가 0부터 시작하는 이유가 바로 a가 배열전체를 의미하는게 아니라 시작주소이기 때문이라는 군요.
:
: 그럼 a[3]은 뭔가...
: 일반적인 배열의 의미로 이런 표현법을 쓰고 다른 언어가 이렇게 많이 쓰니까 C에서도 이런 '표기법'을
: 제공하는거라고 합니다. (음....전 이부분이 좀... 각자 판단하세요. '표기법 제공'은 그런거 같습니다만...)
: a[3]이 실제로 C에서는 4번째 방이 됩니다.
: 벌써 일반적인 배열의 의미인 3번째 방이란 의미를 상실해버렸습니다.
: "a배열의 3번째방"이라는 자연스러운 표현을 그대로 사용한다면 a[0]을 어떻게 해석해야 할까요.
: "a배열의 0번째방"... 은 벌써 자연스러운 표현을 벗어난듯합니다.
: 0번째 방이 실제로 존재할 수 없으니까요.
C/C++ 프로그래밍에서는 사고방식의 전환을 필요로 합니다.
'0번째 방'이란 것은 C언어에서는 정말 자연스러운 표현입니다.
이는 컴퓨터라는 하드웨어 자체가 0부터 시작하기 때문이지요.
예를 들어 8비트 unsigned char가 나타내는 수의 범위는 1부터 256까지가 아니라,
0부터 255까지죠.
즉, 어셈블리 프로그래밍에서도 마찬가지란 겁니다.
'1부터'라는 걸 머릿속에서 지워버리고, 무조건 '0부터' 시작한다고 생각해야 합니다.
심지어 C 프로그래머들은 일상 생활에서도 이런 표현을 씁니다.
"올해는 우리나라가 월드컵을 개최한지 0번째 되는 해이다." ^^;
: C에선 a[0]을 "a주소에서 0번째 떨어진 주소의 방" 다시말해 "a주소에서 전혀 떨어지지 않은 주소의 방"이라고 해석을 합니다.
: 물론 *(a+0)으로 바꾼후에 해석이 가능하다는 논리죠.
: 이렇게 본다면 C에선 a[n]이라는 표현자체의 의미를 그대로 살릴수가 없으니 이런 표현 자체가 적합하지 않다고 봅니다.
: 그래서 C에선 a[0]을 *(a+0)으로 바꿔서 위와 같이 해석을 하는것이죠.
: 엄밀히 따진다면 a[n]은 C에 맞지않는 표현인거 같습니다. (이것은 저는 동의하는 입장입니다.)
: 리플 부탁드립니다.
|