5

コードでは、通常、次のものを使用します。

#include <stdlib.h>

void dref1(char **blah)
{
    (*blah)[0] = 'a';
    (*blah)[1] = 'z';
    (*blah)[2] = 0x00;
}

/* or */

void dref2(char **blah)
{
    char *p = *blah;

    *p++ = 'w';
    *p++ = 't';
    *p = 0x00;
}


int main(void)
{
    char *buf = malloc(3);

    dref1(&buf);
    puts(buf);
    dref2(&buf);
    puts(buf);
    free(buf);

    return 0;
}

私の質問は、それが可能かどうか/ポインタを直接逆参照してインクリメントする方法です:

**blah = 'q';       /* OK as (*blah)[0] ? */
(*blah)++;          /* Why not this? */
*((*blah)++) = 'w'; /* ;or. */
...
4

3 に答える 3

13

あなたの本当の意図はわかりませんが、表現*p++としてとの違いを学ぶ必要があるように思えます。(*p)++

最初の式は、ポインターを逆参照し、ポインターが指している値ではなく、ポインター自体を進めます。

2番目の式は、ポインターを逆参照し、接尾辞++演算子を適用して、指定された値を変更します。ポイントされた値がポインタであるか、単に整数であるかは関係ありません。

これは、単項演算*子と接尾辞++演算子の優先順位と関係があります。括弧がない場合は、++演算子が最初に適用され、その結果が*演算子のオペランドとして使用されます。

編集:

blahこれがタイプであると仮定してchar **、可能な操作とそれぞれが行うことのリストを次に示します。

  • 明らかに、blahタイプの値を生成しますchar **;
  • *blah収量char *;
  • **blah収量char;
  • *(*blah)++blahを取得するために間接参照するchar *と、*p++類推が起こります。
  • **blah++2回逆参照してポイントされた値を取得してから、ポインターblahをインクリメントします。blah
  • (**blah)++blahポインタを2回逆参照すると、類推(*p)++が起こります。
于 2013-01-25T16:05:59.350 に答える
3

はい、できます。ごみをテストするだけです。私はあなたが考えを持っていると思います。

記述方法を使用blahする際の問題は、メインに戻ると、バッファーの内容が変更されるだけでなく(必要に応じて正しく)、ポインターbuf自体も変更されることです。それはあなたが望むものではないかもしれません、そして明らかにあなたが解放する必要があるものではありません。

テスト:

#include <stdlib.h>

void dref1(char **blah)
{
    (*blah)[0] = 'a';
    (*blah)[1] = 'z';
    (*blah)[2] = 0x00;
}

/* or */

void dref2(char **blah)
{
    char *p = *blah;

    *p++ = 'w';
    *p++ = 't';
    *p = 0x00;
}

void dref3(char **blah)
{
    *(*blah)++ = 'w';
    *(*blah)++ = 't';
    *(*blah) = 0x00;
}

void dref4(char **blah)
{
    **blah = 'q';       /* OK as (*blah)[0] ? */
    (*blah)++;          /* Why not this? */
    *((*blah)++) = 'w'; /* ;or. */

}


int main(void)
{
    char *buf = (char*)malloc(3);
    char *buf1=buf;
    dref1(&buf);
    puts(buf);
    dref2(&buf);
    puts(buf);
    dref3(&buf);
    puts(buf);
    puts(buf1);

    buf=buf1;
    dref4(&buf);
    puts(buf);
    puts(buf1);

    free(buf1);

    return 0;
} 
于 2013-01-25T17:01:24.667 に答える
0

に問題はないと思いますdref1

(*blah)[0] = *(*blah)+0 = **blah

だからあなたは書くことができます(*blah)[0]='a';

を実行しても意味がありません。(*blah)++;によって返されたアドレスを単にインクリメントして失うだけですmalloc

于 2017-01-10T05:55:07.807 に答える