2017-10-14 14 views
0

Studentという構造体があるとします。qsort() - 関数パラメータの比較

typedef struct student { 
    int age; 
    char name[10]; 
} Student; 

私は学生へのポインタの配列を持っています。

Student *a[10]; 

私は学生の名前で配列をソートする必要があります。だから私は比較関数を書いた:

int compare(const void *a, const void *b){ 
    Student *temp1=*(Student **)a; 
    Student *temp2=*(Student **)b; 
    return strcmp(temp1->name, temp2->name); 
} 

それから私は、ソートする機能を持っている:

void SortArray(Student *a[], int len){ 
    qsort(a, len, sizeof(Student *), *compare*); 
    printArray(a); 
} 

のqsortの最後の部分は、私は取得しないものです。 &compareと書かれていた投稿と、そうでないところがありました。私が&compareを使用したときだけ、それは働いた。
&を使用するかどうかはどうやって知りますか?

+2

関数は配列と同じように似ています。関数へのポインタが使用されている場合は、関数へのポインタが* decay *されます。たとえば通常は安全です。'compare'だけですが、'&compare'を使用してコードの読者をより明示的にすることをお勧めします。 –

+4

デコレーションは必要ありません。単に 'compare'を渡すだけです。 – Amit

+0

'&compare'は明示的に/全く同じ方法で読むことができます。'&array [0] 'は次のようなものです:言語を知っている人には紛らわしく不快です。ちょうど '比較'または '配列'を使用してください。 **関数func(x)のように関数**を呼び出すたびに、 '()'演算子(関数呼び出し)がそのオペランドとして関数ポインタを必要とするため、 'func'という名前がポインタに壊れていることに注意してください。 –

答えて

1

関数に参照される関数の名前として、関数の名前を使用できます。また、コメントに記載されているように、&も参考になります。

0

はあなたのような関数を呼び出すしようなかった例:) C標準によると

qsort(a, len, sizeof(Student *), ***********compare); 

または

qsort(a, len, sizeof(Student *), &***********compare); 

のような(6.3.2.1左辺値、配列、および関数指定子)

について

4関数指定子は、関数型を持つ式です。それはsizeofのoperator65のオペランド)または単項& オペレータ、タイプを持つ関数指定子 ' タイプを返す関数は、「」 関数戻り型へのポインタを」型を持つ式に変換されている場合を除き '

だからこの式

***********compare 

に機能指定子compareは暗黙のうちに、今度はその上のポインタを機能とするために、再度、関数型に変換され、逆参照を適用し、その後、ポインタを機能するように変換されます。

もちろん、&compareを明示的に指定することはできますが、これは必須ではありません。ここで

が実証プログラムが

#include <stdio.h> 

void f(void) 
{ 
    puts("Hello eitanmayer"); 
} 

void g(void f(void)) 
{ 
    f(); 
} 

int main(void) 
{ 
    g(&******f); 
} 

でその出力はだからあなたのコードの問題は、どこか別の場所にすることができ

Hello eitanmayer 

です。

関連する問題