2

コメント行の機能を理解する必要がありますか?

#include <stdio.h>
void fun(char**);

int main()
{
    char *argv[] = {"ab", "cd", "ef", "gh"};
    fun(argv);
    return 0;
}
void fun(char **p)
{
    char *t;
    t = (p+= sizeof(int))[-1]; //what this line does? //[-1] does what?
    printf("%s\n", t);
}
4

3 に答える 3

4

intマシンで 4 バイトと仮定すると、 4 に置き換えますsizeof(int)

t = (p+= 4))[-1];

ポインタをp4要素進め、1要素戻して要素を取得するだけです。

この例では、配列には 4 つの要素があるため、最後の要素の 1 つ後ろに移動し、最後の要素である に戻り"gh"ます。

いくつかの注意:

  • a[-1]はちょうど*(a - 1)です。
  • ポインター演算を行うときは、常に配列内の要素または最後の要素を指していることを確認する必要があります。
  • また、argv通常は のパラメータを参照するために使用するため、この名前は良い考えではありませんmain
于 2013-09-15T14:47:10.997 に答える
1

これは、前のアイテムに移動することを意味し-1ます。

x[-1]=*(x-1)

ライン全体が

*(x+sizeof(int)-1)

sizeof(int) はおそらく 4 であるため、行は次のようになります。

*(x+4-1)=*(x+3)=x[3]="gh"
于 2013-09-15T14:46:27.673 に答える
0

最初に要素**pのアドレスが含まれます。argv[0]つまり、 (2 バイトとして指定された int のサイズ)だけ"ab"インクリメントされます。次に、.so によってデクリメントされます。最終的には.so の値を出力します。2 "ef"-1"cd"t"cd"

ノート:

C はマシンに依存する言語であるため、sizeof(int) は異なる値を返す場合があります。

上記のプログラムの出力は、Windows (Turbo C) では cd、Linux (GCC) では gh になります。

理解を深めるために、上記のプログラムを Windows (Turbo C コンパイラーを使用) および Linux (GCC コンパイラー) でコンパイルして実行します。

于 2016-02-07T16:36:27.563 に答える