今週は,後期に学習した 配列 と ポインタ のまとめをします.
必ず,今週中に理解しましょう.
配列は,同じ型のデータを一つにまとめて扱うために編み出された方法です.多くのデータを扱うには,なくてはならないものです.配列を用いて,4つのint型変数を用意するには,
int a[4];
と配列を宣言します.
|
a
|
a[0] |
| a[1] | |
| a[2] | |
| a[3] |
配列は,図のようなイメージとなり,4つの変数をまとめて配列aとして扱います.
ここで,中身 a[0] から a[3] (0から3の4個であることに注意)を配列 a の要素とよび,a[0] の 0 のことを,添え字とかインデックスと呼びます.
配列を初期化するには,{ } を使って値を列挙します.
int a[4] = { 1, 2, 3, 4 };
複数の文字(文字列)や日本語を扱うにはどうしたらよいでしょう.文字を組み合わせて配列にした,文字列を用います.文字列をプログラム中で記述するときは,ダブルクオーテーションで囲みます.(例:"ABC","日本")
char a[4] = "ABC";
|
a
|
a[0] | 'A' |
| a[1] | 'B' | |
| a[2] | 'C' | |
| a[3] | '\0' |
文字列を初期化するには,
char c[5] = "ABCD";
とします.文字列の代入は,初期化時のみ行うことができます.
プログラムの途中で,
c = "ABCD"; /* これは,できない */
と代入することはできません.
データのメモリアドレスを指し示す(ポイントする)ための変数
ポインタ変数の値 = メモリアドレス
参考 : 普通の変数の値 = 数値や文字
例:
#include <stdio.h>
void main()
{
int a, b;
int *p;
a = 3;
printf("aのアドレスは,%x です\n", &a);
p = &a;
printf("ポインタ変数の値(アドレス)は,%x です\n", p);
printf("ポインタ変数のさしている値は,%d です\n", *p);
b = *p;
printf("bの値は,%d です\n", b);
}
配列の名前そのものは,実は,配列の最初の要素を指し示すポインタです.
int a[4];
|
a
|
*a | a[0] |
| *(a+1) | a[1] | |
| *(a+2) | a[2] | |
| *(a+3) | a[3] |
例を見てみましょう.
#include <stdio.h>
void main()
{
int a[5] = {10, 20, 30, 40, 50}; /* 配列 */
int *p; /* ポインタ変数 */
int b, c;
printf("配列aの先頭のアドレスは,%x です\n", a);
printf("aのさしている値は,%d です\n", *a);
p = a+2; /* pは,aから2つ先をさします */
printf("a[2]の中身は,%d です\n", *p);
b = *(a+3); /* bは,aから3つ先の値が代入されます */
printf("a[3]の中身は,%d です\n", b);
c = *a+3; /* cは,a[0]の値に3足した値が代入されます */
printf("a[0]+3 は,%d です\n", c);
}
例で,違いを見てみましょう.
#include <stdio.h>
void main()
{
char c[5] = "ABC"; /* 文字列 */
char *p = "ABC"; /* ポインタ変数を用いた文字列の初期化 */
c = "DEF"; /* これはエラー */
p = "DEF"; /* これは正しい */
printf("c = %s \n", s);
printf("p = %s \n", p);
}
後期に出された演習のうち,仕上げていない物を,今週中に提出する.
Oh-o! Meijiのレポートから(第5回)のところへ,演習で作成したプログラムを送る.プログラムには必ず,学年,組,番号,氏名を記入すること.