포인터를 비교하는 방법?
2 개의 포인터가 가정합니다.
int *a = something;
int *b = something;
내가 서비스를 비교하고 같은 장소를 방문 지 확인하고 배포하고 있습니까?
예, 동등성의 정의입니다. 둘 다 동일한 위치를 가리 킵니다 (또는 포인터 별칭입니다 ).
여기에 약간의 사실 은 사양의 관련 텍스트입니다.
같음 연산자 (== ,! =)
동일한 유형의 객체에 대한 포인터는 '직관적 인'예상 결과와 동일한 지 수 있습니다.
에서 § 5.10 은 C ++ 11 표준 :
동일한 유형의 포인터 (포인터 변환 후)가 동일한 지 여러 수 있습니다. 동일한 유형의 두 포인터는 둘 다 null이거나 둘 다 동일한 함수를 가리 키거나 둘 다 동일한 주소 ( 3.9.2 )를 경우에만 동일하게 비교 됩니다.
(멤버 및 널 포인터 상수에 대한 포인터 비교에 대한 세부 정보를 남기고 '내가하는 바를 수행'의 의미 줄 아래로 계속됩니다.)
- [...] 두 피연산자가 모두 null이면 동일하게 비교됩니다. 의미 하나만 null이면 같지 발생을 비교합니다. [...]
가장 '눈에 만나는'경고는 가상과 관련이 예상 할 수있는 것입니다.
- [...] 둘 중 하나가 가상 멤버 함수에 대한 포인터이면 결과는 지정되지 않습니다. 이름이 가장 많이 파생 된 것과 동일한 객체 (1.8)의 동일한 멤버를 참조하는 경우에만 동일하게 비교하거나 클래스 클래스 유형의 가상로 역 참조 된 경우 동일하게 하위를 참조하는 것과 동일합니다. [...]
관계 연산자 (<,>, <=,> =)
에서 § 5.9 은 C ++ 11 표준 :
동일한 유형의 객체 또는 함수에 대한 포인터 (포인터 변환 후)를 다음과 같이 정의 된 결과와 사용할 수 있습니다.
- 두 개의 포인터 (P)와 같은 하나 또는 함수 또는 동일한 어레이의 끝을지나 두 지점 하나에 동일한 유형 점 Q 또는 그 둘 NULL의 경우
p<=q
와p>=q
모두 참 수율p<q
및p>q
양 수율 거짓.- 동일한 유형의 두 포인터 P와 Q가 동일한 object-의 구성원이 아닌 다른 object-나 동일한 배열의 요소 또는 다른 함수를 가리 키 거나 둘 중 하나만 null의 경우 인
p<q,
p>q,
p<=q,
및 의 결과p>=q
는 지정되지 않습니다 .- 두 개의 포인터가 갖는 객체의 비 정적 데이터 멤버 나 해당 멤버의 하위 클래스 또는 배열 요소를 재귀 적으로 가리키면 나중에 선언 된 멤버에 대한 포인터는 두 멤버가 동일한 액세스 제어를 더 크게 비교합니다 (11 절) . 결혼식 클래스가 노조가 아니라면.
- 두 포인터가 액세스 제어가 다른 객체의 비 정적 데이터 멤버를 제 11 항에서 제공합니다.
- 두 포인터가 동일한 공용체 객체의 동일 비 정적 데이터 멤버를 내부적으로 비교합니다 (
void*
필요한 경우로 변환 한 후 ). 두 포인터가 배열의 요소를 가리 키거나 배열의 끝을 벗어난 요소를 가리키면 아래 첨자가 더 높은 개체에 대한 포인터가 더 비교됩니다.- 다른 포인터는 지정되지 않습니다.
따라서 다음과 같은 경우 :
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
'ProgramingTip' 카테고리의 다른 글
Visual Studio 2015 업데이트 3 오프라인 설치 관리자 (ISO) (0) | 2020.11.03 |
---|---|
JUnit에서 정규식 일치 지정 (0) | 2020.11.03 |
Python으로 사용 가능한 com 포트 텍스트 (0) | 2020.11.03 |
MATLAB에서 변수는 기본적으로 정말 배정 밀도입니까? (0) | 2020.11.02 |
e.getMessage ()와 e.getLocalizedMessage ()의 차이점 (0) | 2020.11.02 |