2

以下のコードのconst void *a, const void *bについて説明してください。これらは定数参照パラメーターですか?つまり、この関数の内部コードはその値を変更できませんか? これらのパラメーターを参照する理由 参照パラメーターは、値渡しのためのものであり、関数定義内で値を変更できるようにするためのものであると考えられていました。パラメータ引数に void を使用する理由

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;
}

アドバイスをありがとう。

4

5 に答える 5

2

const typename * pPointer to Constantの構文です。これは、関数内の値を変更できないことを意味します。

typename * const p定数ポインタの構文です。これは、関数内でポインター自体を変更できないことを意味します。

上記の例でtypenameは、標準型からユーザー定義型、void. である場合void、その意図は、関数がさまざまな型へのポインターを取得する可能性があることです。あなたの場合、次の行が行っているように、メンバーにアクセスするには、void ポインターを正しい型に適切にキャストする必要があります。

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

しかし、このキャストは const-ness を失います。正しい構文は次のとおりです。

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

値 const-ness を失わないようにします。


EDIT :コメントの1つが指摘しているように、質問にはタグが付いているだけなのでC++、キャストは次のようにC++スタイルで行う方が良いです:

const Peaks* aa = static_cast<const Peaks*>(a);
const Peaks* bb = static_cast<const Peaks*>(b);
于 2013-03-14T17:39:39.620 に答える
0

型の引数を使用している間は、型の安全性はありません。C スタイルのキャストはできるだけ使用しないでください。void*const

Peaks* aa = (Peaks*) a;

aa無効になり、未定義の動作が発生する可能性があります。


のためにこの機能が必要な場合は、代わりqsortに使用することをお勧めしますstd::sort。その場合、 of をオーバーライドするだけoperator<ですPeaks

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

これはおそらく次のように使用できます:

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

カスタムオブジェクトのベクトルの並べ替えもご覧ください:)

于 2013-03-14T17:53:41.613 に答える
0

const void *aa は定数への void ポインターであることを意味するため、内容を変更することはできません。
説明については、このリンクを参照してください: http://en.wikipedia.org/wiki/Const-correctness

constただし、キャストでコンテンツを失うと、危険なキャストが発生します。

Peaks *aa = (Peaks *)a;

に変更する必要があります

const Peaks *aa = (const Peaks *)a;
于 2013-03-14T17:38:10.887 に答える
0

2 つの void ポインタを比較し、a のキーが b のキーより大きいか、等しいか、または小さいかに応じて、0 より大きい、等しい、または小さい整数を返します。

于 2013-03-14T17:39:25.217 に答える
-1

それらは定数データへのポインターです。正しいです。こちらを参照してください。したがって、ポインターを介してそれらが指すものの値を変更することはできません。

于 2013-03-14T17:38:28.763 に答える