ポインタ

問題1 NULLポインタ

01.cを修正し、ソースコード中で示されているポインタpに格納されたアドレスを表示してください。

Note

なお、printf文で使用されている%pは対応するポインタに格納されるアドレスを表示するフォーマット指定子です。

Note

ヒント:ポインタは定義した時点では、どこも指していません。

問題2 変数からのポインタの生成(アドレス演算子と間接演算子)

02.cでは、int a = 3 となっています。 この変数aが使用するメモリアドレスの先頭は&aとして得られます。

c = &a とする時、aに入っている数値をcを用いて表示しましょう。

問題3 同一の領域への複数のアクセス

03.cでは、整数型ポインタsourceが指す先に3が代入されています。 このとき、sourceが指す先の値を表示しましょう。 ただし、printf文では、sourceを用いてはいけません。

Note

ヒント:同じ領域を指すポインタは複数作れます。

問題4 ポインタをどこもささないようにする

04.cでは、整数型ポインタaが定義され、aの指す先には5が入っています。 このとき、aが何処も指さないように04.cを修正しましょう。

Note

ヒント:ポインタにおいて、アドレス0番は何処も指してない状態(NULL状態)を意味します。

問題5 同じところを指しているから…

05.cでは、整数型変数a=10が定義されています。 aのアドレスを指す整数型ポインタp、qを定義するとき、pが指す先の値が20となるようにしましょう。

問題6 ポインタと配列1

06.cでは、int data[10]という配列があります。 プログラム引数で指定した10未満、0以上の整数値をiに代入したとき、 data[0]とdata[i]のメモリ空間上での番地の差を得るプログラムを作成しましょう。

Note

ヒント:変数が実際に格納されているアドレスを得るには、演算子&を用いる

問題7 ポインタと配列2

問題6を踏まえ、今度はdouble型でも同様の実験をしてみましょう。 double型配列dataにおけるdata[0]とdata[i]のメモリ空間上での番地の差を得るプログラムを作成しましょう。

Note

ヒント:変数が実際に格納されているアドレスを得るには、演算子&を用いる

問題8 ポインタと配列3

08.cを修正し、配列データを走査し、格納されている値を表示するプログラムを作成しましょう。 ただし、変更すべき部分においてdata[i]は用いてはいけません。

問題9 ポインタと配列4

09.cを修正し、ソースコード内で定義されている配列のうち、指定した2つのインデックスに対応する要素を交換して表示するプログラムを作成しましょう。 ただし、それぞれのインデックスが対応するアドレスを用いてください。

例えば、

./a.out 1 2

と実行すると

1
3
2
4
5
6
7
8
9
10

と表示されます。

問題10 配列の途中からアクセスする

10.cではa[10]={1,2,3,4,5,6,7,8,9,10}が定義されています。 ここで、a[3]以降のみを表示したいとします。 これができるプログラムを作成しましょう。 ただし、for文に記載されている条件は変更してはいけません。

Note

ヒント:配列の先頭アドレスがわかれば、そこを始まりとする配列としてアクセスできます。