2015-01-18 2 views
1

, 나는 흥미로운 예를 들어 오셨습니다 다음과 같이 우리가 구조 (C 구조)가 있다고 가정 :비교 포인터 객체 평등

struct qwe 
{ 
    int someData; 
    qwe *ptr; 
} 

나중에 일부 코드를 :

struct qwe d, *p = &d; 
p->someData = 1; 
p->ptr = p; 

I는 다음과 같이 조작을 이용하여,이 포인터는 언어 규격에서 ==의 정의에 기초하여, 동일한 객체를 가리 이해 :

0

은 콘솔 창에 True를 인쇄합니다. 이제 괜찮습니다.하지만이 두 포인터는 같은 개체가 아닙니다. 여기에서의 질문은 POINTER 평등을 검사하는 방법이 있는지에 관한 것입니다. 방법이 있다면 이제 콘솔에 아무런 출력을 생성하지 않을 것이다

struct qwe** pToPtr_1 = &p; 
struct qwe** pToPtr_2 = &(p->ptr); 
if (pToPtr_1 == pToPtr_2) 
    printf("True\n"); 

을 다음과 같이 나는,이 포인터에 대한 포인터를 만든 다음 ==와 함께 그 새로운 포인터를 비교로 내가 뭔가를 할 수 알고,하지만 난 궁금해 포인터 주소를 직접 비교할 수 있습니다. 나는 이것이 (적어도 C 프로그래밍 언어와 요구에 대한 나의 현재의 이해를 바탕으로) 쓸모가 없다는 것을 이해한다. 그러나 나는 아직도 그런 기능이 C (또는 C++)에 존재하는지 알고 싶다.

+0

구조 선언이 유효한 C 코드가 아닙니다 당신은 이전 형식 정의를 '하지 않는 한 typedef struct qwe qwe;'. –

+1

이 두 포인터는 모두 같은 대상이 아닙니다. 무엇을 의미합니까? –

+0

나는 그것이 끝났다고 언급하는 것을 잊었다. 수정 해줘서 고마워. – Transcendental

답변

5

tl; dr : 더 이상 "직접적인"방법이 없습니다. 이미 언어에서 제공하는 기능을 사용하여 두 포인터의 ID를 올바르게 비교하고 있습니다.

당신이 물어 보는 내용은 신원이 인 것과 거의 같지 않습니다. 두 개의 객체가 말 그대로 사실상 동일한 객체 인 것을보고 싶습니다. 메모리의 공간을 차지합니다.이 객체는 동일한 값을 가진 두 개의 개별 객체와 구별됩니다.

앞에서 말씀 드린대로 포인터를 비교하여 두 객체의 신원을 확인할 수 있습니다. 당신은 주소를 비교하고 있습니다. 주소가 같은 경우 실제로는 하나의 개체입니다.

동일한 접근 방식이 포인터에 대해서도 작동합니다. 포인터 자체도 객체입니다.선언 피함으로써

struct qwe** pToPtr_1 = &p; 
struct qwe** pToPtr_2 = &(p->ptr); 
if (pToPtr_1 == pToPtr_2) 
    printf("True\n"); 

당신은 그것을 단축 할 수 있습니다 : 당신은 이미 당신의 대답에 그렇게하기 위해 코드를 작성

if (&p == &p->ptr) 
    printf("True\n"); 
3

모든 변수는 주소로 고유하게 식별 될 수 있습니다.

주소는 주소 연산자 &을 변수에 적용하여 계산됩니다.

그래서 예는 다음 포인터 인스턴스의 equalness에 대한 비교하는

&p == &p->ptr 

과 같을 것이다 값

p == p->ptr 

을 비교.

참고 :이 방법은 포인터에만 국한되지 않지만 모든 데이터 유형의 변수에 적용 할 수 있습니다.