第7講 箱の住所を代入できる箱(ポインタ)の学習
第2話 ポインタの簡単な実例
誰でも実例がないと、
どんなに丁寧に説明されても理解することは難しいものです。
ここでは簡単に実例を見てから、
解説していくことにしましょう。
#include<stdio.h>
void f();
int main(){
f();
return(0);
}
void f(){
int a,*b;
a=1;
b=&a;
printf("a=%d\n",a);
printf("a=%d\n",*b);
printf("*b=%d\n",*b);
printf("b=%08x\n",b);
printf("&a=%08x\n",&a);
}
コピペ用添付ファイル
実行結果
a=1
a=1
*b=1
b=0061fe14
&a=0061fe14
皆さんの頭には?がたくさん浮かんでいますよね。
bが実はポインタです。
b=&a;
の&aは箱aのアドレス=メモリ住所です。
*bでそのアドレスにある箱の中身になります。
ですから、
printf("a=%d\n",a);
printf("a=%d\n",*b);
printf("*b=%d\n",*b);
の3行の実行結果が
a=1
a=1
*b=1
と全部同じになるわけです。
printf("b=%08x\n",b);
ポインタbの中身が16数表示で示されています。
b=0061fe14
%08xのxは16進数表示08は8桁で上位桁が0ときはそれを表示しなさいの指定です。
printf("&a=%08x\n",&a);
は箱aのアドレスの表示です。
&a=0061fe14
printf("b=%08x\n",b);
printf("&a=%08x\n",&a);
の両者が同じ結果になるのは同然です。
a=1;
b=&a;
bにはaのアドレスが入っているからです。
scanf("%d",&n);
の&nも箱nのアドレス=メモリ住所だったわけです。
*と&の関係を表にしておくと
箱または箱の中身 | 箱の住所を入れる箱または住所 | |
int a;と宣言 | a | &a |
int *b;と宣言 | *b | b |
上の表で『または』が入っている理由を説明しましょう。
例えば、
int a;
a=1;
printf("%d\n",a);
というコードのとき、同じaでも意味が少し違います。
=の左側にあるとき(a)は箱そのものを指し、
それ以外のとき(a)は箱に入っている中身1を意味します。
中身を見ること(実際上は、中身をコピーして使うこと)を参照といいます。
ですから、=の左側にないときは参照を意味します。
int *b;
b=&a;
printf("b=%08x\n",b);
のbについても同じで、bは住所を収納する箱そのものですし、
bは参照すなわち箱の中身である住所です。
という対応関係になります。
つまり、
int *b;
と宣言すると、実は2つの箱が同時に用意されることになります。
整数を入れる箱*bとその箱*bの住所を入れる箱bです。
では、皆さんコードを
#include<stdio.h>
void f();
int main(){
f();
return(0);
}
void f(){
int a,*b;
a=1;
b=&a;
printf("a=%d\n",a);
printf("a=%d\n",*b);
printf("*b=%d\n",*b);
printf("b=%08x\n",b);
printf("&a=%08x\n",&a);
a=2;
printf("a=%d\n",a);
printf("a=%d\n",*b);
printf("*b=%d\n",*b);
printf("b=%08x\n",b);
printf("&a=%08x\n",&a);
}
コピペ用添付ファイル
と変更したら実行画面はどうなりますか?
次話をクリック!
第1話へ 第3話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ