2013-09-06 2 views
1

, 우리는 포인터에 의해 구성 요소의 액세스를 통해 간다. 우리는 기능이 제공됩니다 : 우리는 포인터를 사용하지 않은 경우K & R 포인터 조작

struct key *binsearch(char *word, struct key *tab, int n) 
{ 
    int cond; 
    struct key *low = &tab[0]; 
    struct key *high = &tab[n]; 
    struct key *mid; 

    while (low < high) { 
     mid = low + (high-low)/2; 
     if ((cond = strcmp(word, mid->word)) < 0) 
      high = mid; 
     else if (cond > 0) 
      low = mid + 1; 
     else 
      return mid; 
    } 
    return NULL; 
} 

이 프로그램의 이전 버전을, 우리는 mid = (low+high)/2mid를 계산할 수 있지만 지금은 내가 이해 mid

mid = low + (high-low)/2로 계산해야 논리적으로 유용한 결과를 반환하지 않기 때문에 포인터를 추가 할 수 없습니다. 그러나 이해할 수없는 것은 여전히 ​​포인터를 추가하지 않는 것입니까? mid = low + (high-low)/2? (high-low)/2의 결과에 low을 추가하고 있습니까?

+0

[읽기] (http://stackoverflow.com/questions/394767/pointer-arithmetic?rq=1). – WhozCraig

답변

0

나는 논리를 내 오해를 알아 냈어. 두 개의 포인터를 빼면 두 개의 포인터 사이의 거리가 포인터에 추가 될 수 있습니다. 하여 예의

+0

두 포인터의 차이로부터 'offset'을 결정합니다. 그런 다음 다른 포인터의 주소를'base '로 사용할 수 있습니다. 일반적으로 포인터, 특히 배열로 작업 할 때 데이터는'BASE + OFFSET'에 존재합니다. 이 점을 알게되어 반갑습니다. – DevNull

0

포인터는 배열로 가리키는 포인터 등 자체는 순차적으로 (그들이 가리 각 요소 사이의 4 또는 8 바이트 씩 증가)를 넘버링한다. 따라서 로우에서 하이 포인터를 빼면 배열의 범위 (바이트 단위)를 얻을 수 있습니다. 2로 나눈 다음 중간에있는 점을 찾기 위해 밑면에 추가하십시오. 기본적으로 배열을 인덱싱하여 이와 동일합니다.

mid = low + (high - low)/2; // Dealing with pointers 

보다는 :

mid = (low + high) /2; // Indexing an array using integers 

빠른 답변 : C 언어는 두 개의 포인터 GCC Error: Invalid operands to binary +

를 추가 금지

더 흥미로운 질문은 왜 수학적 논리로 반전되어 더 긴 대답 : 추가 (후자 접근법)의 문제점은 데이터 유형의 최대 범위를 오버플로합니다. 32bit 컴퓨터의 경우 (K & R이 작성되었을 때 16 비트가 일반적 이었지만) 정수 및 포인터의 최대 범위는 각각 +/- 20 억 및 4Gb입니다. 배열을 인덱싱

, 그것은 배열 만 개 항목의 몇 가지 이상을 가지고, 그래서 심지어 10,000,000 + 10,000,000 오버 플로우 발생하지 않을 가능성이다. 포인터를 처리 할 때

그러나 당신은 당신은 많은 수에서 시작하는 메모리 블록을 할당받을 0에서 시작되지 않습니다. 운영 체제와 컴파일러에 따라 다르며 특히 스택의 항목을 처리하는 경우 32 비트 범위에서 오버플로가 발생할 수있는 두 개의 포인터를 추가 할 때 전적으로 가능하므로 C는이를 허용하지 않으므로 포인터를 빼야합니다. ,

temp = (high - low)/2 

임시 정수 값 높고 낮은 포인터 사이의 거리의 절반이 보는

+0

그리고 11 억 개 이상의 요소가있는 배열이 있고 부호없는 32 비트 int를 사용하여 인덱싱하는 경우 기술적으로 K & R의 인덱스 배열에 대한 버전도 손상됩니다. http://googleresearch.blogspot.co.uk/2006/06/extra-extra-read-all-about-it-nearly.html – jmc

0

방법 중 하나는, 계산이 있다는 것이다.

mid = low + temp 

mid는 낮은 주소 + 오프셋, temp입니다. temp는 포인터가 아니라 인덱스 양입니다.

따라서,이 방법은 하지는 두 개의 포인터를 추가한다.