2013-03-14 3 views
2

const void * a, const void * b을 코드에 설명하십시오. 이 상수 참조 매개 변수입니까? 즉이 함수의 내부 코드는 값을 변경할 수 없습니다. 이 매개 변수를 참조로 만드는 이유는 무엇입니까? 참조 매개 변수는 값 전달을위한 것이며 함수 정의 내에서 값이 변경 될 수 있다고 생각합니다. 매개 변수 인수에 void를 사용하는 이유는 무엇입니까?C++ 구문 : 상수 참조 매개 변수

int peak_compare(const void *a, const void *b) //Function peak_compare 
{ 
    Peaks *aa = (Peaks *)a; 
    Peaks *bb = (Peaks *)b; 

    if(aa->wt1 > bb->wt1) return -1; 
    if(aa->wt1 == bb->wt1) return 0; 
    return 1; 
} 

주저하지 말고 감사드립니다.

+0

* "를 사용하는 이유를 보라 매개 변수 인수에 대해 'void'? "* - 여기에 사용 된 유형은 실제로'void * '이며이 코드 작성자 중 한 사람의 결정도 이해할 수 없습니다. – LihO

+2

이 함수는 아마도 ['qsort'] (http://en.cppreference.com/w/cpp/algorithm/qsort)와 ['bsearch'] (http : // ko)와 같은 C 알고리즘과 함께 사용하기위한 것입니다. cppreference.com/w/cpp/algorithm/bsearch). –

+1

이고 비 const 로의 캐스트는 악합니다. 'const Peaks * '를 사용하십시오 – WhozCraig

답변

2

const typename * p에 대한 구문입니다. 포인터는 상수입니다. 즉, 함수의 값을 변경할 수 없습니다.

typename * const p상수 포인터의 구문입니다. 즉, 함수에서 포인터 자체를 변경할 수 없습니다.

위의 예에서 typename은 표준 유형에서 사용자 정의 유형까지, void까지 될 수 있습니다. void 인 경우 함수는 다른 유형의 포인터를 가져올 수 있습니다. 당신은 제대로 다음 줄이하고있는 귀하의 경우와 같이 회원을 액세스하기 위해 유형을 정정 무효 포인터를 캐스팅해야합니다

Peaks *aa = (Peaks *)a; 
Peaks *bb = (Peaks *)b; 

그러나이 캐스트는 CONST 다움을 잃게됩니다. 올바른 구문은 다음과 같습니다

const Peaks *aa = (const Peaks *)a; 
const Peaks *bb = (const Peaks *)b; 

이 값 CONST 다움을 잃지 않도록.


편집 :

const Peaks* aa = static_cast<const Peaks*>(a); 
const Peaks* bb = static_cast<const Peaks*>(b); 
+0

고마워요! 잘 설명했다. – sintiaWeb

+0

당신을 진심으로 환영합니다. – meyumer

+0

C++의 경우 C++ 스타일의 캐스팅을 권장합니다. 'const Peaks * aa = static_cast (a);' – Bill

0

const void *a은 a가 상수에 대한 void 포인터임을 의미하므로 내용을 변경할 수 없습니다.
는 설명은이 링크를 참조하십시오 : http://en.wikipedia.org/wiki/Const-correctness

을하지만 당신은 당신의 캐스트와 const 내용을 풀어로 후 위험한 캐스트가있다.

Peaks *aa = (Peaks *)a; 

const Peaks *aa = (const Peaks *)a; 
-1

변경해야합니다 그들은 정확한 일정 데이터에 대한 포인터이다, here 그래서 당신은 그들이 포인터를 가리키는 물건의 값을 변경할 수 없습니다를 참조하십시오.

+0

감사합니다 링크는 매우 유익한 내 질문을 명확히했다. – sintiaWeb

+0

왜 투표가 다운 되었습니까? – Dutts

0

a의 키가 b의 키보다 크거나 같은지 또는 작은지를 비교하여 두 개의 void 포인터를 비교합니다. peak_compare().

+0

전체 기능을 요약합니다. 감사! – sintiaWeb

+0

당신은 환영합니다 !!! –

0

이된다 코멘트 중 하나가 지적하고 질문 만 C++ 태그되기 때문에 다음과 같이 캐스트가 더 나은 C++에서 스타일을 완료함에 따라 유형 안전const이든 아니든간에 void* 유형의 인수를 사용하십시오. 가능한 한 C 스타일 캐스트를 사용하지 않아야합니다.

Peaks* aa = (Peaks*) a; 

정의되지 않은 동작로 될 것이다, 무효 인 aa로 이어질 수 있습니다.


이 경우 당신은 당신이 대신 std::sort를 사용하는 것이 좋습니다 때문에 qsort의이 기능이 필요합니다. 이 경우 그냥 무시할 수 operator<Peaks의 : 가능성이처럼 사용할 수

struct Peaks 
{ 
    bool operator < (const Peaks& p) const 
    { 
     return (wt1 < p.wt1); 
    } 
}; 

가 :

std::vector<Peaks> vec; 
... 
std::sort(vec.begin(), vec.end()); 

는 또한 Sorting a vector of custom objects :