2016-11-19 6 views
0

私は*((int *) arg)を記述するための用語に慣れていないので、詳細を調べるためにトピックをGoogleで正常にクエリできませんでした。私はここでも何かを見つけられなかった。ここで*((int *)arg)は何をしますか?

The Linux Programming Interfaceからのコードのsnippitです:

static void *threadFunc(void *arg) 
{ 
    int loops = *((int *) arg) 
    ... 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t t1; 
    int loops, s; 

    loops = (argc > 1) ? getInt(argv[1], GN_GT_0, "num-loops") : 10000000; 
    s = pthread_create(&t1, NULL, threadFunc, &loops); 
    ... 
} 

int loops = *((int *) arg)は何をやっていると、この現象は何と呼ばれますか?ありがとう。

+1

'void *'を 'int *'にキャストして逆参照していますか? – UnholySheep

答えて

1

これは、ポインタ逆参照*some_pointerとキャスト(some_type)some_value_with_some_other_typeを組み合わせています。これは基本的には「Hey Cコンパイラだよ、これはだと思っているけど、それはint*でなければならないと思うよ、そんなに扱ってもらえますか?ああ、あなたがそれをしている間に、私にintポインタが "を指しています。

+0

会話のような引用は良いアプローチでした。ありがとうございました。今は完全に意味をなさない。 – 8protons

1

argしかしながら関数threadFuncでは、この中でこのよう代わりint *

static void *threadFunc(void *arg) 
         ^^^^^^^^^ 

の種類void *を有するものとして宣言されているタイプint

s = pthread_create(&t1, NULL, threadFunc, &loops); 
              ^^^^^^ 

の変数のアドレスを格納するポインタであります式

int loops = *((int *) arg) 
最初に0

ポインタ型int *

(int *) arg 

のポインタとして再びinterpretatedし、それが指すオブジェクトを取得する

*((int *) arg) 
+0

したがって、基本的に 'threads '()を通して' loops'のアドレスを渡します。 'threadFunc()'の先頭では、 'arg'は' loop 'のアドレスを指すvoidポインタです。次に、 'void *'から 'int *'に 'arg'をキャストし、' arg'を使って 'loop 'のint値を取得しますか?右の音ですか? – 8protons

+0

@ 8protonsはい、あなたは正しいです。 –

1

することがタイプ「INT」の整数を読み取ることが間接参照されますポインタ変数 'arg'のメモリアドレスから'(int *)'は、コンパイラがポインタをvoidにするのではなく、ポインタをintにポインタとして再解釈するように型キャストされます。

1

からの判断ポインタが関数へのポインタを保持すると仮定します。このテクニックはLinuxで多く使われています。具体的には、特定の条件で呼び出される関数であり、プログラマがよく宣言する関数であるcallbacksコールバックのための汎用プロトタイプを保持する変数(あなたの場合は整数へのポインタをとります)と、イベントに応じてそのポインタにコールバックを割り当て、必要なときにコールします。

関連する問題