2

「値による呼び出し」に関する大学のコースの講義ノートから:

void fun(int *ip)

{

*ip =100;

}

によって呼び出された

int n=2;  

int *np;

np = &n; 

fun(np);

n の値を 100 に変更します。

「int *ip」と言うとき、正確には何を意味するのでしょうか? 整数型のポインタ? もしそうなら、引数として np を指定して fun() を呼び出すと、np は整数ではない n のアドレスを持っているため、エラーが発生するはずではありませんか?

そして、ip の値を 100 に変更します。これは、n がアドレス 100 の「メモリ スロット」にある値を持っているということではないでしょうか。私は何かが欠けていると確信しています。:)

4

8 に答える 8

7

整数型のポインタ?

いいえ、整数のポインタです。

np を引数として fun() を呼び出した場合、np のアドレスは n であり、整数ではないため、エラーが発生するのではないでしょうか?

nは整数なので問題ありません。&nnpそしてipすべてがコード内で同じ型を持っています: int*.

次に、ip の値を 100 に変更します。

いいえ… の値で*ipはなく の値を変更しますip。つまり、ip 指す値を変更します (これは、 pointeeと呼ばれることもあります)。

于 2010-01-19T21:58:41.223 に答える
0

はい、int *パラメーター型として使用funすると、int へのポインターを受け入れると言っています。それnpを渡すintへのポインタであるため、問題ありませんfun

npipは のアドレスを指しているnため、 のような値を割り当てると、を指して*ip = 42いるメモリ位置に 42 の値が割り当てられます。ipn

于 2010-01-19T21:57:01.847 に答える
0

サンプル コードにあるものは、ポインターによる受け渡しと呼ばれます。関数には、integer へのポインター型のパラメーターがあります。したがって、関数に渡される値は変数のアドレスnです。この関数、ポインター parameter が指す100変数 (つまり、メモリー位置) に代入します。スターはC/C++の間接参照演算子です。ip*

于 2010-01-19T22:00:20.293 に答える
0

type*型として使用されるのは、「その型へのポインタ」を意味します

一般的な使用法は ですが、ポインターの逆参照と区別しやすいように、つまりint *varと書くのが好きです。int* var*ptr

int* aつまり、a は int 型のオブジェクトへのポインターであり、a が指すオブジェクトを意味*aし、&aオブジェクト a のアドレスを意味します。

于 2010-01-19T22:00:34.303 に答える
0

fun() では、ip の値を 100 に変更するのではなく、ip が指すメモリ位置を変更しています。

于 2010-01-19T22:00:31.480 に答える
0

npタイプのようにお考えint*ください。この目的のために、アスタリスクとint一緒に「intへのポインター」タイプを作成し、分離できないことに注意してください。

于 2010-01-19T22:00:41.370 に答える
0

ipはポインタであり、ip*それが指している「メモリスロット」にアクセスします。npもポインタです。を使用し&nて、 のメモリスロットのアドレスを割り当てnますnp。そのため、 を呼び出すと、アクセスされる唯一のメモリ スロットfun()内に の 1 つが割り当てられるため、 に100 が割り当てられます。fun()nn

于 2010-01-19T22:02:37.497 に答える
0

n と np の両方が数値を格納するため、ここで多少の混乱が生じる可能性があります。ただし、コンパイル時に、コンパイラは数値を異なる方法で使用します。つまり、

n++;

np++;

どちらも実際には算術演算であり、生成されるアセンブリは異なります。最終的に、コンピューター内のすべてのデータは数値であることを覚えておくことが重要です。それらは、私たちが異なる方法で扱うという理由だけで、異なるタイプのデータになります。

具体的には、あなたの例に関して、

*np = 100;

dereference*を意味し、その操作は代入の前に行われることを覚えておく必要があります。余分な括弧を使用すると、より明確になる場合があります。

(* (np) ) = 100;

または別のコンテキストで:

int n = *np;

さて、私は言わなければなりません、あなたが言うとき、それは私の心を温めます、

ip の値を 100 に変更すると、n の値がアドレス 100 の「メモリ スロット」にあるということになりますか? それは、私が重要な理解とみなしていることに反するからです。しかし、私が言っていることは正しいと思います。ポインターに対してそのようなことを行うには、道を譲らなければなりません。

static_cast<int>(np) = 100;

np である数値を別の種類の数値として扱うようにコンピューターに指示するため、これはあなたが説明したことを行います。static_cast<char*>(np)np が指す数を整数ではなく文字として扱うのと同じ方法で。

于 2010-01-20T05:47:44.073 に答える