0

私は、Javaのキューのインターフェースに等しい.hファイルの例を示す本を読みました。

void InitQueue(Queue* pQueue, int iSize);
bool Insert(Queue* pQueue, const Item* pItem);
bool Extract(Queue* pQueue, Item** pItem);
bool GetFirst(const Queue* pQueue, Item** pItem);
bool IsFull(const Queue* pQueue);
bool IsEmpty(const Queue* pQueue);

私は2つのことを理解していませんでした:

  1. なぜExtract, GetFirst2番目の引数は型Item**であり、ではないのItem*ですか?私たちがそのようなことを書いたとき、どういう意味ですか?
  2. 一部の関数(IsFull, IsEmpty、..)で、const Queue*単純ではなく引数として取得するのはなぜQueue*ですか?
4

3 に答える 3

3

IsFull()とIsEmpty()は、Queueオブジェクトを変更しないことを意味するため、const引数を取ります。これは一定であり、変更されません。

抽出とGetFirstは**を使用します。これは次の理由によるものです。

int a;           // Declares an int
a = 2;           // Sets a to 2
int *b = &a;     // Declares a pointer pointing to that int
*b = 4;          // Sets a to 4
int **c = &b;    // Declares a pointer pointing to that pointer to that int
**c = 6;         // Sets a to 6

cを関数に渡す場合:

int global_var;

int main() {
  modify_ptr(c);
}

void modify_ptr(int **ptr)
{
  *ptr = &global_var;
}

渡したばかりのポインタ自体が変更されました。** cは、aではなくglobal_varを指すようになりました。

これらのポインターをgetfirstとextractに渡す理由は、これらが「より優れた」関数であるためです。つまり、データへのポインターを返す必要があります。したがって、彼らはポインターを返すことができる必要があり、これらが採用する方法は、上記の例のようにポインターをポインターに渡すことです。これにより、正しい要素を指すように渡すものを変更できます。

于 2012-05-03T15:26:43.480 に答える
2

なぜ、Extract2GetFirst番目の引数は型Item**であり、ではないのItem*ですか?そんなことを書いたときはどういう意味ですか?

関数内でポインタを変更できるようにします。
ほとんどの場合、これは、Itemポインターが呼び出し元によって渡されるが、関数内に割り当てられることを意味します。ポインタを値で渡すだけでは、これを行うことはできません。これは、渡される元のポインタではなく、ポインタのコピーにメモリが割り当てられるためです。

プログラマーがポインターを渡す呼び出し元とそれを割り当てる関数のこのセマンティクスを使用する理由を言うのは難しいです。理想的には、ソースシンクメカニズムが期待されます。

一部の関数(IsFull、、IsEmpty..)で、const Queue*単純ではなく引数として取得するのはなぜQueue*ですか?

定数の正確さのために!
これは、関数のユーザーに、指定されたデータが関数内で変更されないことを示します。

于 2012-05-03T15:21:36.783 に答える
1

なぜExtractでGetFirst2番目の引数はItem**型であり、Item *ではないのですか?私たちがそのようなことを書いたとき、どういう意味ですか?

それらは出力です。キューは明らかにアイテムへのポインタの束で構成されています。これはポインターなので、引数を1つだけ作成Extractして取得し、ポインターを返します。GetFirstヌルポインタは失敗を示します。開発者はこの方法でそれをしませんでした。代わりに、彼らは古いCスタイルのパラダイムを使用しました。なんで?知るか。これは、これらを書くための最良の方法ではありません。

一部の関数(IsFull、IsEmpty、..)で、単にQueue *ではなく、引数const Queue *を取得するのはなぜですか?

引数をとしてマークするconstと、コードのユーザーに、関数が引数の内容に対して何もしないことを通知します。constプログラミングの良い習慣であるように、そのような邪魔されない参照とポインタの引数をマークします。

于 2012-05-03T15:25:16.817 に答える