第5回:ポインタと配列 まとめ


 今週は,後期に学習した 配列 と ポインタ のまとめをします.

 必ず,今週中に理解しましょう.


配列

配列は,同じ型のデータを一つにまとめて扱うために編み出された方法です.多くのデータを扱うには,なくてはならないものです.配列を用いて,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'
Null 文字 ”¥0” 文字列の終わりを示す

文字列を初期化するには,

char c[5] = "ABCD";

とします.文字列の代入は,初期化時のみ行うことができます.

プログラムの途中で,

c = "ABCD";   /* これは,できない */

と代入することはできません.


ポインタ変数

データのメモリアドレスを指し示す(ポイントする)ための変数

ポインタ変数の値 = メモリアドレス

  参考 : 普通の変数の値 = 数値や文字


ポインタ変数の基本的な書式

int *p;
ポインタ変数の宣言.型を指定し,変数名の前に*をつける
p = &a;
ポインタ変数pにはint型変数aのアドレスが入る.ポインタ変数にアドレスを入れるには,対象となる変数の前に&をつける
b = *p;
ポインタ変数に格納されているアドレスに格納されているを取り出すには,ポインタ変数の前に*をつける

例:

#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回)のところへ,演習で作成したプログラムを送る.プログラムには必ず,学年,組,番号,氏名を記入すること.