3

intおよびポインター変数の値を出力するこのコードではchar、なぜそれらに異なる方法でアクセスするのでしょうか? charポインターの場合は書き込みますsampleclientが、int書き込みの場合は*intid. 一方が使用するのに他方が使用しないのはなぜ*ですか?

int main()
{
    char client[] = "ABCD";
    int intid = 10;

    samplepass(&client, &intid);

    return 0;   
}

void samplepass(char *sampleclient, int *intid)
{
    printf("%s %d\n", sampleclient, *intid);
}
4

3 に答える 3

1

C では、文字列 (文字配列) を のような関数に渡すことができないprintfため、次善の策を講じます: メモリ内のアドレスを渡します。この関数は、ポインタ演算を使用してメモリ アドレスを配列のように扱うことができます。したがって、printf文字列を読み取る方法は、文字列へのポインターを取り込むことです。次に、ポインターアドレス (の代わりに使用して取得できる) ではなく、%s逆参照された文字列 (ここ) を表示します。 ABCD%p%s

整数の問題はより単純です。*in*intidは、「このアドレスに格納されている値を取得する」ことを意味します。10そのため、メモリ アドレスではなく が 出力されます。

メモリ アドレスを取得するための「正しい」書式指定子は%p. しかし、次のように書くこともできます:

int main()
{
    char client[] = "ABCD";
    int intid = 10;

    samplepass(&client, &intid);

    return 0;   
}

void samplepass(char *sampleclient, int *intid)
{
    printf("%d %d\n", sampleclient, intid);
}

私のマシンでは、出力は

-2140958000 -2140958004

client(そして、それらはとのメモリ内のアドレスですintid)。%pforを代用すると、前%dに a が付いた適切にフォーマットされたポインターが得0xられ、標準に準拠しているため、それを使用します。

于 2013-09-09T16:01:02.353 に答える
0

次のような出力の場合:

あべっど10

回線を変更する

からsamplepass(&client,&intid);
まで samplepass(client,&intid);

于 2013-09-09T16:06:56.850 に答える