プログラミング実習II (2026) 課題
a には,整数が格納されます.
&a は,変数 a が存在するメモリ上のアドレス(番地)を指します.
scanf において,&a と書いていることを思い出しましょう.
int *p; とポインタを定義し,p = &a; とすることで,変数 a が存在するメモリ上のアドレスを指します.
p が指すアドレスに格納されている値を参照するには,*p とします.
a = 5;,p = &a;,とすれば,*p は 5 となります. [リスト 8.1] を参考に, 下のプログラムに文を追加して, 変数 a, b, c のアドレスを表示せよ.さらに,これらがメモリ上でどのように格納されているかを下に示すような図を活用して報告せよ
アドレスは, printf の書式指定を %p とすることで,16進数で表示される.
#include <stdio.h>
int main (void)
{
int a = 1234;
int b = 5678;
int c = 7777;
/* ここに a, b, c のアドレスを表示する文を追加 */
return 0;
}
アドレス 内容
│ │
│ │
3221224176 ├──────┤
3221224177 │ │
3221224178 │ c 7777 │
3221224179 │ │
3221224180 ├──────┤
3221224181 │ │
3221224182 │ b 5678 │
3221224183 │ │
3221224184 ├──────┤
3221224185 │ │
3221224186 │ a 1234 │
3221224187 │ │
3221224188 ├──────┤
│ │
|
前問(T9_1)で示されたプログラムに対して,[リスト 8.2] を参考にポインタ pa, pb, pc を定義せよ(例えば,int *pa;).次に,それぞれに対して変数 a, b, c のアドレスを代入した上で,それらのアドレス(書式は%p)とそこに格納された値(書式は%d)を表示せよ.
下のプログラムを実行した上で,int a = ...; から printf 文までの各行について,それぞれ何が行われているかを [リスト 8.2] を参考にしてレポートにて説明せよ.
#include <stdio.h>
int main (void)
{
int a = 1234;
int x;
int *p;
p = &a;
x = *p + 4321;
printf("%p %p %p \n", &a, p, &x);
printf("%d %d %d \n", a, *p, x);
return 0;
}
[リスト 8.3][リスト 8.4][リスト 8.5] のプログラムを実行し,それぞれについてアドレスの変化を観察して,なぜそのような結果が表示されるのかを説明せよ. プログラムの提出はいずれかひとつでよい.なお,sizeof 演算子はデータのバイト数を返すもので,3.2.4項に説明がある.
[リスト 8.6] のプログラムを実行し,ポインタに対する加算や,ポインタ同士の減算がどのような計算を行うことになるか説明せよ.
[リスト 8.8]および[リスト 8.9]を入力し実行した上で,ポインタと配列の類似点および相違点についてレポートにて説明せよ. [リスト 8.9]のプログラムを提出すること.
[リスト 8.12] を入力し実行した上で,このプログラムでなぜ値の交換が正しく行われないかを説明せよ. さらに,C言語によるプログラミング 8.2.4項をよく読んだ上で,関数 swap の引数をポインタとすることで,値の交換を行うプログラムを作成して提出せよ.