2016-06-02 4 views
0

K & R에서 유효한 포인터 연산은 같은 유형의 포인트를 할당하거나 같은 배열을 더하거나 뺍니다 ...... 다른 모든 포인터 연산은 불법입니다.C에서 유효 포인터 연산에 문제가 발생했습니다

그러나 Wikipedia에서 Doubly linked list의 코드를 읽을 때 링크 된 목록의 다른 노드를 가리키는 두 개의 포인터를 비교합니다. 그것은 나를 많이 혼란스럽게했다. 여기에, 그것은 pFast 및 pCurrent을 비교 코드

unsigned int DetectCycleinList(void) 
    { 
     DoublLinkedList* pCurrent = pHead; 
     DoublLinkedList* pFast = pCurrent; 
     unsigned int cycle = FALSE; 
     while ((cycle == false) && pCurrent->pNext != NULL) 
     { 
      if (!(pFast = pFast->pNext)) 
      { 
       cycle = false; 
       break; 
      } 
      else if (pFast == pCurrent) 
      { 
       cycle = true; 
       break; 
      } 
      else if (!(pFast = pFast->pNext)) 
      { 
       cycle = false; 
       break; 
      } 
      else if (pFast == pCurrent) 
      { 
       cycle = true; 
       break; 
      } 
      pCurrent = pCurrent->pNext; 
     } 
    } 

입니다 불법이 아니다.

+2

포인터 * 산술 *입니다.이 포인터는 다른 개체에 대한 포인터와 함께 사용할 수 없으며 같음 테스트가 아닙니다. 따라서 두 포인터가 같은 배열을 가리키면 그 배열을 뺍니다. 그러나 포인터가 다른 객체와 동일한 경우에도 포인터는 의미가 없습니다. –

+0

K & R과 같은 소리는 뾰족한 데이터의 조작을 가리키는 반면 Wikipedia 기사는 포인터 자체의 조작을 나타냅니다. –

답변

2

N1570에 따르면, 비교할 두 포인터가 동일한 배열의 요소를 가리켜 야한다는 제한이 없습니다. pFastpCurrent이 가리키는 것은 같은 유형의 객체이므로 비교하는 것은 합법입니다. N1570 6.5.9 평등 사업자에서

인용구 :

제약 개최한다 다음의

이 하나 :
- 두 피연산자가 산술 유형이;
- 두 피연산자 모두 호환되는 유형의 정규화되지 않은 버전에 대한 포인터입니다.
- 하나의 피연산자가 객체 유형에 대한 포인터이고 다른 하나는 정규화 된 또는 정규화되지 않은 버전의 void에 대한 포인터입니다. 또는
- 하나의 피연산자는 포인터이고 다른 하나는 널 포인터 상수입니다.

[...]

6 개의 포인터 비교 동일한 경우 모두가 널 포인터 경우에만 (객체 와 처음에 하위 객체에 대한 포인터를 포함 함) 같은 객체에 모두 포인터 또는 함수는 모두 에 대한 포인터이며 동일한 배열 객체의 마지막 요소보다 한 포인터이거나 하나의 배열 객체 끝에서 하나의 포인터 인 이고 다른 하나는 다른 배열 객체의 시작에 대한 포인터입니다. 주소 공간의 첫 번째 배열 객체 바로 뒤에옵니다.

0

두 포인터간에 비교가 이루어질 수 있습니다. 포인터 p 배열 a의 첫 번째 요소를 가리키는 경우 검사 할 경우 예를 들어, :

if (p == a) 
    /* a points to the start of a */ 

포인터 연산을하지만, 더 제한됩니다.

+0

'=='및'! ='에는 동일한 배열 제한이 없습니다. –

+0

@ n.m. 문제가 해결되었습니다. – stackptr

관련 문제