3

ポインターを初期化する C の関数があるとします。

void initialize(Pointer * p);

パラメータ p は [out] パラメータだと思います。

次に、p を取得して操作する関数があります。

void manipulate(Pointer * p)

ここで、p が [out] なのか [in/out] なのか疑問に思います。

私たちはそれを操作しているだけなので、[アウト]と言います。入ってくるものはすでに初期化されているので、[in/out] と言います。

どれが本当なの?と思いました。

4

5 に答える 5

2

それを示す宣言には何もありません。唯一の真の決定は、関数内のコードが何をするかです。

より新しい実装では、constキーワードを使用して読み取り専用パラメーターを示すことができます。

void manipulate(const Pointer * p)

これは*p関数内で を割り当てることができないことを示しているため、読み取り専用 (またはin) 型です。ただし、constが欠落している場合でも、読み取り専用になる可能性があります。

于 2012-11-26T08:32:36.420 に答える
1

どちらも完全に真実ではありません。

関数へのポインタを渡しています。したがって、ポインタの値を渡すのでと見なすことができます。また、おそらくポインティを変更しているので、アウトと見なすことができます。

だから私はこれを理論の内外で購入しません。単なるポインタとして残しておきます:)

于 2012-11-26T08:34:58.110 に答える
1

標準Cには直接入力/出力の概念はありません。ただし、独自のマクロを定義することでそれを行うことができます。

実際には、すべてのパラメーターの受け渡しは2つの方法でのみ行われます。

1. pass by value
2. pass by address

そして、それはあなたがどのように操作するかはあなた次第です。着信パラメータを変更したくない場合は、を使用してconstください。

于 2012-11-26T08:35:27.530 に答える
1

Pointer型自体が のように実際のポインタでない場合typedef int *Pointerinitialize関数は引数にメモリを割り当てることができません。

その場合、ポインターを参照として渡す必要があります。つまり、ポインターのアドレスを渡す必要があります。つまり、関数はポインターへのポインターを引数として受け取る必要があります。

void initialize(Pointer **p)
{
    *p = malloc(sizeof(Pointer));
    ...
}

として呼び出す

Pointer *p;
initialize(&p);
于 2012-11-26T08:39:18.200 に答える
0

例 1

char buf[256];

void manipulate(char * p)
{
    strcpy(p,"Just test string");
}

int main()
{
    manipulate(buf);
    printf("%s\n",buf);
}

上記の例では、buf 文字列はスタティック バッファ メモリとして初期化されます。この manipulate関数は、メッセージをバッファ メモリにコピーします。

例 2

char *buf;

void initialize(char **p)
{
    *p = malloc(256*sizeof(char));
}

void manipulate(char * p)
{
    strcpy(p,"Just test string");
}

int main()
{
    initialize(&buf)
    manipulate(buf);
    printf("%s\n",buf);
}

2 番目の例では、buf は定義で初期化されていない文字列へのポインタです。ここでの初期化関数initializeはバッファを使用するためchar **p 、これを使用した理由は、関数がポインタのアドレスを初期化することを意味します。*p関数で行われたように変数を渡すと、ポインターが指してmanipulate()いるメモリの内容のみを変更できることを意味します。p

于 2012-11-26T08:44:22.357 に答える