IEにおいて、
[Math Processing Error] となって数式等が正しく表示されないときは、
互換表示をOFFにすること!
配列データの表示〜配列とポインタと関数〜
1.グローバル(大域)変数として配列データを持つ
/* Array */
#include <stdio.h>
/* 配列データ */
int data[15] = { 123, 106, 777, 580, 216, 136, 700, 351, 229, 197 };
/* データの個数 */
int datanum = 10;
/* 全データを表示する */
main()
{
int i;
for( i = 0; i < datanum; i++ )
printf("%5d", data[i] );
}
/* end of array1.c */
- 配列にデータを格納する場合は、その個数を覚えておく必要がある
- そのための変数が datanum
- データ数が固定なら定数でも良いが...
- グローバルだから何処からでもデータ(data)にアクセスできる
- データを守るとしたらローカル(局所)変数を使う!⇒
- 何度もデータを表示するとしたら関数を作った方が便利!⇒
2.全データを表示する関数
/* Array */
#include <stdio.h>
/* 配列データ */
int data[15] = { 123, 106, 777, 580, 216, 136, 700, 351, 229, 197 };
/* データの個数 */
int datanum = 10;
/* 全データを表示する関数 */
void dispdata()
{
int i;
for( i = 0; i < datanum; i++ )
printf("%5d", data[i] );
}
/* 全データを表示する */
main()
{
dispdata();/* 全データを表示する関数の呼び出し */
}
/* end of array2.c */
- 関数呼び出しのみでmainの中はすっきり!
- データを守るとしたらローカル(局所)変数を使う!⇒
3.オート(自動)・ローカル(局所)変数として配列データを持つ
/* Array */
#include <stdio.h>
/* 全データを表示する */
main()
{
/* 配列データ */
int data[15] = { 123, 106, 777, 580, 216, 136, 700, 351, 229, 197 };
/* データの個数 */
int datanum = 10;
int i;
for( i = 0; i < datanum; i++ )
printf("%5d", data[i] );
}
/* end of array3.c */
- mainの外からは配列dataにアクセスできない
- 何度もデータを表示するとしたら関数を作った方が便利!⇒
4.全データを表示する関数(配列版)
/* Array */
#include <stdio.h>
/* 全データを表示する関数 */
void dispdata( int a[], int n )
{
int i;
for( i = 0; i < n; i++ )
printf("%5d", a[i] );
}
/* 全データを表示する */
main()
{
/* 配列データ */
int data[15] = { 123, 106, 777, 580, 216, 136, 700, 351, 229, 197 };
/* データの個数 */
int datanum = 10;
dispdata( data, datanum );
}
/* end of array4.c */
- 仮引数が int a[] と配列の様になっているが、
実際には配列データがコピーされて渡される訳ではない!
- dispdata( data, ...で渡されるのは配列dataの先頭アドレスで
先頭要素(data[0])へのポインタ(intを指す)である
- だったら、int *a と受けた方が良さそうな...⇒
5.全データを表示する関数(ポインタ版)
/* Array */
#include <stdio.h>
/* 全データを表示する関数 */
void dispdata( int *a, int n )
{
int i;
for( i = 0; i < n; i++, a++ )
printf("%5d", *a );
/* printf("%5d", a[i] ); と書いても良い */
}
/* 全データを表示する */
main()
{
/* 配列データ */
int data[15] = { 123, 106, 777, 580, 216, 136, 700, 351, 229, 197 };
/* データの個数 */
int datanum = 10;
dispdata( data, datanum );
}
/* end of array5.c */
- ポインタを進め(a++)ながらそれが指すデータ(*a)を表示しても良いが、
a[i] と配列要素の様に記述しても良い
- a[i] は *(a+i) のこと!!
- 関数の仮引数については、int a[] と int *a は同じである
- とことんポインタにこだわって⇒
6.全データを表示する関数(最もCらしい版!?)
/* Array */
#include <stdio.h>
/* 全データを表示する関数 */
void dispdata( int *a, int n )
{
while( n-- > 0 )
printf("%5d", *a++ );
}
/* 全データを表示する */
main()
{
/* 配列データ */
int data[15] = { 123, 106, 777, 580, 216, 136, 700, 351, 229, 197 };
/* データの個数 */
int datanum = 10;
dispdata( data, datanum );
}
/* end of array6.c */
- ループ変数かつインデックス変数の i も不要だし、格好良い感じもするが、
オーソドックスに配列の様に書いた方が分かりやすい!⇒
- n-- と渡されたデータの個数を減らしているが、datanum には影響しない!Why?
- Because: Call by Value
- n-- (declement after use)を --n (decletemnt before use)としたらどうなる?!
- *a++ は *(a++) で、式の値は *a で、a は後で1個進む(inclement after use)
- *a++ を *++a (inclement before use)としたらどうなる?!
- *a++ を (*a)++ としたらどうなる?!⇒