[c] ‘C’에서 색인이 0으로 시작되는 이유는 무엇입니까?
왜 배열의 색인 생성이 1이 아닌 C에서 0으로 시작합니까?
답변
C에서 배열의 이름은 기본적으로 포인터 (그러나 주석 참조)이며 메모리 위치에 대한 참조이므로 표현식 array[n]
은 n
시작 요소에서 떨어진 메모리 위치 요소를 나타냅니다. 이는 인덱스가 오프셋으로 사용됨을 의미합니다. 배열의 첫 번째 요소는 해당 배열이 참조하는 메모리 위치 (0 개의 요소)에 정확히 포함되므로로 표시되어야합니다 array[0]
.
더 많은 정보를 위해서:
http://developeronline.blogspot.com/2008/04/why-array-index-should-start-from-0.html
답변
이 질문은 1 년 전에 게시되었지만 여기에갑니다 …
위의 이유에 대해
하지만 다 익스트라의 기사 (이전에 지금은 삭제에서 참조 대답은 ) 수학적 관점에서 의미가 있습니다, 그것은 관련으로하지 않습니다 이 프로그램에 올 때.
언어 사양 및 컴파일러 디자이너가 내린 결정은 컴퓨터 시스템 디자이너가 0부터 카운트를 시작하기로 한 결정을 기반으로합니다.
가능한 이유
대니 코헨 (Danny Cohen)의 평화 에 대한 간청 에서 인용 .
모든 b의 경우, 첫 번째 b ^ N
음이 아닌 정수는 번호가 0에서 시작하는 경우에만 정확히 N 자리 (앞의 0 포함)로 표시됩니다.
이것은 매우 쉽게 테스트 할 수 있습니다. base-2에서 2^3 = 8
8 번째 숫자는 다음과 같습니다.
- 1부터 카운트를 시작하면 8 (바이너리 : 1000)
- 0부터 카운트를 시작하면 7 (바이너리 : 111)
111
3
비트 를 사용하여 표현할 수 있지만 1000
추가 비트 (4 비트)가 필요합니다.
이것이 왜 관련이 있습니까?
컴퓨터 메모리 주소에는 비트 단위의 2^N
셀 이 있습니다 N
. 이제 1부터 계산을 시작하면 2^N
셀에 N+1
주소 줄 이 필요 합니다. 정확히 하나의 주소에 액세스하려면 추가 비트가 필요합니다. ( 1000
위의 경우). 이를 해결하는 또 다른 방법은 마지막 주소에 액세스 할 수 없게하고 N
주소 행을 사용하는 것 입니다.
둘 다 최적의N
주소 라인을 사용하여 모든 주소에 액세스 할 수있는 시작 카운트 0에 비해 차선책입니다 .
결론
에서 시작하기로 결정한 0
이후에는 실행중인 소프트웨어를 포함한 모든 디지털 시스템에 코드가 침투 하여 기본 시스템이 해석 할 수있는 코드로 코드를 변환하는 것이 더 간단 해졌습니다. 그렇지 않은 경우, 머신과 프로그래머 사이에서 모든 어레이 액세스에 대해 불필요한 변환 조작이 하나 있습니다. 컴파일이 쉬워집니다.
논문에서 인용 :
답변
왜냐하면 0은 배열의 포인터에서 배열의 첫 번째 요소까지의 거리입니다.
치다:
int foo[5] = {1,2,3,4,5};
0에 액세스하려면 다음을 수행하십시오.
foo[0]
그러나 foo는 포인터로 분해되고 위의 액세스는 포인터에 액세스하는 유사한 포인터 산술 방법을 갖습니다.
*(foo + 0)
요즘 포인터 산술은 자주 사용되지 않습니다. 그러나 되돌아 가면 주소를 가져 와서 X “ints”를 시작점에서 멀어지게하는 편리한 방법이었습니다. 물론 현재 위치를 유지하려면 0을 추가하십시오!
답변
0 기반 인덱스가 허용하기 때문에 …
array[index]
…로 구현하려면 …
*(array + index)
인덱스가 1 기반 인 경우 컴파일러는 다음을 생성해야합니다. *(array + index - 1)
이 “-1″은 성능을 저하시킵니다.
답변
컴파일러와 링커를 더 간단하게 만들 수 있기 때문입니다 (작성하기 쉬움).
참고 :
“… 주소와 오프셋으로 메모리를 참조하는 것은 거의 모든 컴퓨터 아키텍처의 하드웨어에서 직접 표현되므로 C의이 디자인 세부 사항으로 인해 컴파일이 더 쉬워집니다.”
과
“… 이것은 더 간단한 구현을 만듭니다 …”
답변
배열 인덱스는 항상 0으로 시작합니다. 기본 주소가 2000이라고 가정합니다 arr[i] = *(arr+i)
. 이제이 if i= 0
의미 *(2000+0
는 배열에서 첫 번째 요소의 기본 주소 또는 주소와 같습니다. 이 인덱스는 오프셋으로 취급되므로 deaault 인덱스는 0부터 시작합니다.
답변
같은 이유로 수요일이고 누군가가 수요일까지 며칠을 물으면 1이 아니라 0이라고 말하고 수요일이 며칠 동안 목요일까지 며칠을 물으면 2가 아니라 1을 말합니다.