今週は,C言語を学習する上でもっとも挫折することの多い,でも,C言語のもっともC言語らしいところである,ポインタについて取り上げます.
キーボードから入力した文字列を,文字コード順に並べ替え画面に表示するプログラムを作成する.
#include <stdio.h>
void main()
{
char c[256];
int i, j, n;
char temp;
printf("文字列を入力してください:");
scanf("%s", c);
for(i=0; c[i] != 0; i++){
printf("%2d番目の文字 = %c\n", i+1, c[i]);
}
n = i; /* 文字数を,n に代入 */
printf("%d 文字を並べ替えます\n", n);
for(i=0 ; i<n-1 ; i++){
for(j=i+1 ; j<n ; j++){
if(c[i] > c[j]){
temp = c[i];
c[i] = c[j];
c[j] = temp;
}
}
}
printf("ソート結果発表\n");
for(i=0; i<n; i++){
printf("%2d番目の文字 = %c\n", i+1, c[i]);
}
}
まずは,ウォーミングアップに アドレスについて復習します.

では,ある変数の使っているメモリのアドレスを調べるには,どうしたらよいでしょうか.変数名の頭に「&」を付けると,そのデータがしまわれているメモリのアドレスを意味します.(scanf関数を用いてキーボードから値を読み取るとき,変数名の頭に,「&」を付けたのを思い出してください.)
#include <stdio.h>
void main()
{
int a;
printf("aのアドレスは,%x です\n", &a);
}
逆にあるアドレスにしまわれている値を調べるには,どうしたらよいでしょうか?
データのメモリアドレスを指し示す(ポイントする)ための変数
ポインタ変数の値 = メモリアドレス
参考 : 普通の変数の値 = 数値や文字
例:
#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);
}
変数a,bに数字をキーボードから入力し,a+bを求めて表示するプログラムをポインタ変数を使って書き換えよ.
元になるプログラム:
#include <stdio.h>
void main()
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("a + b = %d\n", a+b);
}
書き換えるプログラム:
#include <stdio.h>
void main()
{
int a,b;
int *pa,*pb;
pa = &a;
pb = &b;
scanf("%d",?????);
scanf("%d",?????);
printf("a + b = %d\n",?????????);
}
配列の名前そのものは,実は,配列の最初の要素を指し示すポインタです.

例を見てみましょう.
#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);
}
先週の演習で作ったプログラムを,ポインタを使って書き換えよう.
Oh-o! Meijiのレポートから(第5回)のところへ,演習で作成したプログラムを送る.プログラムには必ず,学年,組,番号,氏名,メールアドレスを記入すること.