この記事は「MOOC」から初公開されました IT雑貨やプログラマーサークルのホットニュースをもっと知りたい方は「MOOC」に注目!
著者:張磊 | MOOC講師
C言語のポインタ
C言語のポインターは、多くの難しい操作を完了することができるC言語の魂であると人々に考えられています。しかし、C 言語でのポインタの存在は悪夢のようなものだと感じる人が増えています。少しの不注意が悲惨な結果を招くからです。
C のポインターが好きかどうかに関係なく、この一見魔法のようなことを学ばなければなりません。ポインターの概念は、C 言語によってではなく、ソビエトのコンピューター科学者によって開始されたためです。
1. ポインターとは
ポインターとは これは魂からの拷問です。実際、ポインタも変数です。前にも言いました。別の変数のアドレスを格納するだけです。変数アドレスは、変数がメモリに格納されている場所のインデックスです。
`int *a;
int b=5;
a = &b; ``
ここでは、整数型のポインターを定義しますa
.ポインターの定義は変数の宣言と一致していることがわかりますが、変数宣言の前に余分な文字を追加する必要があります*
.
変数のアドレスはポインターに格納する必要があるため、変数自体に格納されている値ではなく、値を割り当てるときに変数のアドレスを取得する必要があります。ここでは、変数のアドレスを取得する&
ために。取得したアドレスをポインタ変数に代入します。
ポインタに格納されたアドレスに格納された値を使用する場合は、ポインタ変数名の前に追加して、対応するアドレスに格納された値を取得*
する。
2. サンプルプログラム
#include <stdio.h>
int main()
{
int *a, b = 100, *c;
printf("a value = %p, a address = %p, a point value = %d\n", a, &a, *a);
printf("b value = %d, b address = %p\n", b, &b);
printf("c value = %p, c address = %p, c point value = %d\n", c, &c, *c);
a = &b;
printf("a value = %p, a address = %p, a point value = %d\n", a, &a, *a);
c = a;
printf("c value = %p, c address = %p, c point value = %d\n", c, &c, *c);
printf("b value = %d, b address = %p\n", b, &b);
return 0;
}
操作結果:
この例の実行結果の 16 進数で表されるアドレスは、マシンごとに異なり、実行するたびに変化します。オペレーティングシステムによってシステムに割り当てられるメモリは毎回異なるためです。
a value = 0x7fffaf0005a0, a address = 0x7fffd2942a28, a point value = -1991643855
b value = 100, b address = 0x7fffd2942a24
c value = 0x7fffd2942b20, c address = 0x7fffd2942a30, c point value = 1
a value = 0x7fffd2942a24, a address = 0x7fffd2942a28, a point value = 100
c value = 0x7fffd2942a24, c address = 0x7fffd2942a30, c point value = 100
b value = 100, b address = 0x7fffd2942a24
サンプルプログラムでは、整数型のポインタを宣言しa
、整数型の変数も宣言して同時に初期化していますb
。
最初に、この時点でポインタ変数a
にこのアドレスは であり0x7fffaf0005a0
、a
変数0x7fffd2942a28
、この時点で格納されているメモリ アドレスです。格納されている値である-1991643855
。ここで説明する必要があるのは、この時点でa
変数が.変数に格納されている値はランダムであるため、変数が表す値もランダムであり、使用する前に割り当てる必要があります. . これは、すべての変数の使用と一致しています。
b
変数の保存値は100
、そのメモリアドレスは です0x7fffd2942a24
。
ポインタ変数c
に格納された値がアドレス0x7fffd2942b20
、自身のアドレスが0x7fffd2942a30
、内部に格納されたアドレスに格納された値が です1
。
次に、割り当て操作を実行しました。ここでの代入操作は、変数b
のa
。
このとき、変数に格納された値が変数のアドレスになっているa
ことがわかりますが、変数自体のアドレスは変更されていません。また、変数に。b
a
a
b
100
ポインター間の代入は、代入が直接行われる限り、通常の変数の代入と同じで、比較的直接的です。
以下の表は、この一連の変更を示しています
初期状態
変数名 |
変数の値 |
住所 |
ポインタアドレスの値 |
a |
0x7fffaf0005a0 |
0x7fffd2942a28 |
-1991643855 |
b |
100 |
0x7fffd2942a24 |
|
c |
0x7fffd2942b20 |
0x7fffd2942a30 |
1 |
配属後
変数名 |
変数の値 |
住所 |
a |
0x7fffd2942a24 |
0x7fffd2942a28 |
b |
100 |
0x7fffd2942a24 |
c |
0x7fffd2942a24 |
0x7fffd2942a30 |
終わり
C 言語の比較的抽象的な部分として、ポインターは多くの初心者にとって最も難しい部分です。でもリラックスしてください。ポインターと通常の変数の間に本質的な違いはないため、実際にはポインター変数と呼ぶ方が適切です。ポインタは、別の変数のメモリ アドレスを格納する変数です。すべての変数にはアドレスがあり、ポインター変数自体にもアドレスがあります。値を代入するとき、変数名を介して他の変数によって取得された変数のアドレスをポインター変数に格納し、ポインター変数に格納されたアドレスの値を取得するか、変数のアドレスを別の変数に引き続き割り当てます。ポインター変数。ポインター変数の存在は単なる変数の代入です。形而上学として理解することを忘れないでください。
ようこそ「MOOC」アカウントへようこそ! 私たちは常に独自のコンテンツにこだわり、IT サークルで高品質のコンテンツを提供し、ドライな知識を共有します. 一緒に成長しましょう!
この記事はもともと Muke.com で公開されたものです。転載の際は出典を示してください。ご協力いただきありがとうございます