Cでのポインタと関数++
-
21-09-2019 - |
質問
大学での講座の講義ノートから、「コール・バイ・値」に
void fun(int *ip) { *ip =100; }
タグによって呼び出されます
int n=2; int *np; np = &n; fun(np);
100 nの値を変更します。
私たちが言う「int型* IP」、まさに我々は何を意味するのですか?整数型のポインタ?もしそうなら、我々はその引数としてNPを楽しんで()を呼び出すとき、NPが整数でないn個のアドレス、?
を持っているように、そこにエラーではありませんそして、私たちは100にIPアドレスの値を変更するには、その平均値のnということは、今のアドレス100と、「メモリスロット」での価値を持っていることではないのですか?私は何かが欠けています確信しています。 :)
解決
型のポインタ整数
いいえ、ポインタにの整数。
私たちはその引数としてNPを楽しんで()を呼び出すとき、NPがnのアドレスを持っているとして、は、そこに整数ではありませんこれは、エラーではないでしょうか?
n
ので全く問題はありません整数です。 &n
、np
とip
すべてのコードでは、同じタイプがあります。int*
を
そして、私たちは、100
へのIPの値を変更
はありません...我々は*ip
のではなく、ip
の値を変更します。つまり、我々は(また時々、の指示先全角>と呼ばれている)ip
のポイントのためにその値を変更します。
他のヒント
int *
のパラメータの型としてfun
を使用する場合、はい、あなたはそれがint型へのポインタを受け入れると言っています。 np
はfun
にそれを渡すintへのポインタであるので大丈夫です。
np
とip
あなたがn
のような値を割り当てるときに、それは*ip = 42
が指しているメモリ位置に42の値を代入し、ip
のアドレスを指している - 。n
である
あなたは、サンプルコードを持っているポインタを渡しのと呼ばれるもの。あなたの関数は、型のパラメータを持つのポインタへの整数の。だから関数に渡された値は、変数n
ののアドレスのです。変数(すなわちメモリ位置)に機能割り当て100
はポインタパラメータip
によってを指摘しました。スター*
は、C / C ++でのの間接参照演算子のです。
()、あなたは100へのIPの値を変更していない、あなたはメモリ位置に変更しているIPによって指されます。
type*
型手段として使用される「その型へのポインタ」
一般的な使用はint *var
であるが、私はそれすなわちint* var
、ポインタをdereferenceingからより良く区別させるような*ptr
としてそれを書きたい。
int* a
手段ので、*a
オブジェクトがと&a
によって指さ手段、int型のオブジェクトへのポインタでは、オブジェクトAのアドレスを意味する。
型np
のようint*
考えます。クマ、この目的のためにアスタリスクと一緒にint
は「ポインタint型への」タイプを作り、かつ分離可能ではないことを念頭に置いています。
ip
は、あなたがそれを指しています「メモリスロット」にアクセスip*
で、ポインタです。 np
もポインタです。 &n
を使用して、あなたはn
にnp
のメモリスロットのアドレスを割り当てます。 fun()
、内部fun()
を呼び出すときに、アクセスの唯一のメモリスロットはn
の一つであり、したがってn
100に割り当てられています。
いくつかの混乱が、ここで可能です両方のnおよびNP店舗数理由 - しかし、コンパイル時に、異なった番号を使用することをコンパイラ。
一方、つまり、n++;
と
np++;
は両方実際に演算され、アセンブリ生成さが異なっています。最終的には、コンピュータ内のすべてのデータが数値である、ことを覚えておくことが重要です。私たちは違ったそれらを扱うので、彼らは単にデータの異なるの種類のになります。
具体的にあなたの例に関してで、
*np = 100;
あなたは*
手段はの間接参照を、その操作が割り当て前に起こることを覚えておく必要があります。それは余分括弧と明確かもしれます:
(* (np) ) = 100;
または異なる文脈で
int n = *np;
今、私が言わなければならない、それが私の心を温め、あなたが言うとき、
私たちは100にIPアドレスの値を変更し、その平均値のnということは、今のアドレス100と、「メモリスロット」での価値を持っていることではないのですか? それは私が重要な理解と見なすもの偽りとして。しかし、私はあなたが、ポインタにそういうことをやるためにあなたの方法を出て行く必要があり、私が言うとき、私は右だと信じています:
static_cast<int>(np) = 100;
それは数の異なる種類としてNPである数を処理するためにコンピュータに指示しますので、これは、あなたが説明するものだろう。同じようにそのstatic_cast<char*>(np)
ではなく整数としてよりも、文字と番号のNP点を扱っていました。