2013-04-26 1 views
8

topic에 따르면 과 포인터를 비교하여 배열의 마지막 요소를 지나서 비교할 수 있습니다.포인터 비교는 배열 객체의 첫 번째 요소 앞에 하나를 사용하여

및 배열 객체의 첫번째 요소 앞에 하나 포인터 비교 @jalf 의견에 따라 금지된다.

int array[10]; 
int *ptr; 
for(ptr=&array[9]; ptr>(array-1); ptr--) {...} 

예 2

int array[10]; 
int *ptr; 
for(ptr=&array[9]; ptr>=(array); ptr--) {...} 

1

예 1

) 모두 예 1예 2이 금지인가?

2) 배열 객체의 첫 번째 요소 앞에 포인터를 과 비교한다는 증거가 C 표준에서 있습니까?

+2

왜 : 특별한 이유는 2 개의 포인터를 사용하여 (배열 내에서) 모든 요소 슬라이스를 나타낼 수 있기 때문입니다. 슬라이스의 첫 번째 요소와 마지막 요소를 가리키는 경우 빈 슬라이스를 나타낼 수 없습니다. 그러나 반 개방 범위를 표현함으로써 다음과 같이 할 수 있습니다.'[p, p]'는 빈 슬라이스를 나타냅니다. –

답변

13
  1. 예, 둘 다 정의되지 않은 동작입니다. 첫 번째 경우 array-1은 정의되지 않습니다. 두 번째 경우에 ptrarray과 같을 때 반복 이후에 감소 될 때 정의되지 않습니다.
  2. 이것은 표준의 섹션 6.5.6에 의해 덮여, 제 8 (강조 내이다)

정수형을 갖는식이에 첨가하거나 포인터로부터 감산하면, 결과 보유 포인터 피연산자의 유형 포인터 피연산자가 배열 객체의 요소를 가리키고 배열이 충분히 큰 경우 결과는 원본 요소의 오프셋 요소를 가리키고 그 결과 원래 배열 요소의 첨자의 차이가 정수 표현식과 동일하게됩니다. 다시 말해서, 만일 배열 객체 표현 (P)+N (등가 N+(P)) 및 (P)-N (N의 값 n을 갖는 경우) 포인트의 i 번째 엘리먼트에 표현 P 포인트 각각 i+n 번째 및 i−n - 배열 오브젝트의 요소를 나타냅니다. 또한 표현식 P이 배열 객체의 마지막 요소를 가리키는 경우 (P)+1 표현식은 배열 객체의 마지막 요소보다 1을 가리키고 Q 표현식이 배열 객체의 마지막 요소보다 하나를 가리키는 경우 (Q)-1 점 배열 객체의 마지막 요소에 추가합니다. 포인터 피연산자와 결과가 동일한 배열 객체의 요소를 가리 키거나 배열 객체의 마지막 요소를 지나는 경우 평가에서 오버플로가 발생하지 않아야합니다. 그렇지 않은 경우 동작은 정의되지 않음입니다. 결과가 배열 객체의 마지막 요소보다 하나를 가리키는 경우 평가 된 단항 * 연산자의 피연산자로 사용되어서는 안됩니다. 위치의 요소는 하나 개의 종래의 첫 번째 요소는 상기 룰의 "그렇지 않으면"절에 해당하면서

표준은 배열 객체의 마지막 요소 과거 위치 하나의 요소를 포함하는 길이를 진행한다.

+0

답변 해 주셔서 감사합니다. 그래서 그것은 다른 주제와 같은 단락입니다. 나는 처음에는 잘 지내지 않았다. 설명 해줘서 고마워. – MOHAMED

관련 문제