ProgramingTip

포인터를 비교하는 방법?

bestdevel 2020. 11. 3. 08:20
반응형

포인터를 비교하는 방법?


2 개의 포인터가 가정합니다.

int *a = something;
int *b = something;

내가 서비스를 비교하고 같은 장소를 방문 지 확인하고 배포하고 있습니까?


예, 동등성의 정의입니다. 둘 다 동일한 위치를 가리 킵니다 (또는 포인터 별칭입니다 ).


여기에 약간의 사실 은 사양의 관련 텍스트입니다.

같음 연산자 (== ,! =)

동일한 유형의 객체에 대한 포인터는 '직관적 인'예상 결과와 동일한 지 수 있습니다.

에서 § 5.10 은 C ++ 11 표준 :

동일한 유형의 포인터 (포인터 변환 후)가 동일한 지 여러 수 있습니다. 동일한 유형의 두 포인터는 둘 다 null이거나 둘 다 동일한 함수를 가리 키거나 둘 다 동일한 주소 ( 3.9.2 )를 경우에만 동일하게 비교 됩니다.

(멤버 및 널 포인터 상수에 대한 포인터 비교에 대한 세부 정보를 남기고 '내가하는 바를 수행'의 의미 줄 아래로 계속됩니다.)

  • [...] 두 피연산자가 모두 null이면 동일하게 비교됩니다. 의미 하나만 null이면 같지 발생을 비교합니다. [...]

가장 '눈에 만나는'경고는 가상과 관련이 예상 할 수있는 것입니다.

  • [...] 둘 중 하나가 가상 멤버 함수에 대한 포인터이면 결과는 지정되지 않습니다. 이름이 가장 많이 파생 된 것과 동일한 객체 (1.8)의 동일한 멤버를 참조하는 경우에만 동일하게 비교하거나 클래스 클래스 유형의 가상로 역 참조 된 경우 동일하게 하위를 참조하는 것과 동일합니다. [...]

관계 연산자 (<,>, <=,> =)

에서 § 5.9 은 C ++ 11 표준 :

동일한 유형의 객체 또는 함수에 대한 포인터 (포인터 변환 후)를 다음과 같이 정의 된 결과와 사용할 수 있습니다.

  1. 두 개의 포인터 (P)와 같은 하나 또는 함수 또는 동일한 어레이의 끝을지나 두 지점 하나에 동일한 유형 점 Q 또는 그 둘 NULL의 경우 p<=qp>=q모두 참 수율 p<qp>q양 수율 거짓.
  2. 동일한 유형의 두 포인터 P와 Q가 동일한 object-의 구성원이 아닌 다른 object-나 동일한 배열의 요소 또는 다른 함수를 가리 키 거나 둘 중 하나만 null의 경우 인 p<q, p>q, p<=q,의 결과 p>=q 는 지정되지 않습니다 .
  3. 두 개의 포인터가 갖는 객체의 비 정적 데이터 멤버 나 해당 멤버의 하위 클래스 또는 배열 요소를 재귀 적으로 가리키면 나중에 선언 된 멤버에 대한 포인터는 두 멤버가 동일한 액세스 제어를 더 크게 비교합니다 (11 절) . 결혼식 클래스가 노조가 아니라면.
  4. 두 포인터가 액세스 제어가 다른 객체의 비 정적 데이터 멤버를 제 11 항에서 제공합니다.
  5. 두 포인터가 동일한 공용체 객체의 동일 비 정적 데이터 멤버를 내부적으로 비교합니다 ( void*필요한 경우로 변환 한 후 ). 두 포인터가 배열의 요소를 가리 키거나 배열의 끝을 벗어난 요소를 가리키면 아래 첨자가 더 높은 개체에 대한 포인터가 더 비교됩니다.
  6. 다른 포인터는 지정되지 않습니다.

따라서 다음과 같은 경우 :

int arr[3];
int *a = arr;
int *b = a + 1;
assert(a != b); // OK! well defined

또한 확인 :

struct X { int x,y; } s;
int *a = &s.x;
int *b = &s.y;
assert(b > a); // OK! well defined

그러나 귀하의 질문 에 따라 늘어나는 .something

int g; 
int main()
{
     int h;
     int i;

     int *a = &g;
     int *b = &h; // can't compare a <=> b
     int *c = &i; // can't compare b <=> c, or a <=> c etc.
     // but a==b, b!=c, a!=c etc. are supported just fine
}

개체 : 표준 라이브러리에는 또 어떤 것이 있습니까?

§ 20.8.5 / 8 "템플리트 greater, less, greater_equal, 그리고 less_equal, 어떤 포인터 유형에 대한 전문 내장 사업자 짝수 경우 , 전체 순서를 얻을 <, >, <=, >=하지 않습니다."

그래서, 당신은 베어가 아닌 친구와 사용 하는 한 전 세계적으로 이상한 것을 주문할 수 있습니다 .void*std::less<>operator<


==포인터 연산자는 숫자 주소를 비교하여 객체를 확인합니다.


요약하자면. 두 포인터가 동일한 메모리 위치를 예상 지 확인 선택 그렇게 할 수 있습니다. 또한 두 개의 개의 포인터가 메모리의 내용을 비교할 수 있습니다. 먼저 역 참조를 기억하십시오.

우리가 가지고 있다면

int *a = something; 
int *b = something;

동일한 유형의 두 포인터입니다.

메모리 주소 비교 :

a==b

내용 비교 :

*a==*b

포인터 앨리어싱을 확인하는 간단한 코드 :

int main () {
    int a = 10, b = 20;
    int *p1, *p2, *p3, *p4;

    p1 = &a;
    p2 = &a;
    if(p1 == p2){
        std::cout<<"p1 and p2 alias each other"<<std::endl;
    }
    else{
        std::cout<<"p1 and p2 do not alias each other"<<std::endl;
    }
    //------------------------
    p3 = &a;
    p4 = &b;
    if(p3 == p4){
        std::cout<<"p3 and p4 alias each other"<<std::endl;
    }
    else{
        std::cout<<"p3 and p4 do not alias each other"<<std::endl;
    }
    return 0;
}

다수 :

p1 and p2 alias each other
p3 and p4 do not alias each other

포인터가 필요 가정 해 보겠습니다.

int *a = something1;
int *b = something2;

& something1 인 something1의 주소를 알고 있습니다. 또한 something2의 주소는 & something2입니다.

따라서 포인터가 주소 두 주소가 올바른지 확인해야합니다.

그래서 당신은 다음과 같은 것을 사용합니다.

if(&something1 == &something2) {
//do something
}

또는 == 연산자를 사용하여 포인터 a가 포인터 b와 동일한 값을 확인할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/9086372/how-to-compare-pointers

반응형