第11回配列とポインタ(2)

第11回配列とポインタ(2)
文字列定数とポインタ
 配列のコピー
 多次元配列
 ポインタ配列

文字列定数とポインタ

文字列定数
 ""で囲むと文字列定数
 "abc"

は、'a' と 'b' と 'c' と '\0'からなる
ポインタと文字列定数
char *str = " hoge ";
str
h


o
g
e
\0
ポインタは、文字列定数のアドレスを指しているの
みなので、指すアドレスを変更することができる
文字列配列は、配列自体に文字列が入っているた
め、アドレスを代えることはできない
配列のコピー
2つの配列のコピー
char a[] = "hoge";
char b[10];
b = a; ← ダメ
※ ただし、bがポインタ変数ならば問題なし
 配列のコピーは、要素ごと(1個ずつ)代入する必要がある
for( i = 0; a[ i ] != '\0'; i ++)
b[ i ] = a[ i ]; /* 1個ずつコピー */
b[ i ] = a[ i ];
 文字列のコピーには、strcpyというライブラリ関数を使うのが一
般的
strcpy(dest,src); /* src配列からdest配列にコピー */

2次元配列
2次元配列の宣言
int a[10][20]; /* 10行20列の配列 */
 要素の指定は、
行・列で指定する
a[n][m] /* n行、m列 */
a[10][20]
※やはり0オリジン
 2次元配列でa[n] と
示した場合は、n+1行目
の行全体を示している1次元
10個
配列と同じである。

20個
2次元配列の初期化
例)
int a[2][3] = { {1,2,3,4},{0,1,2,3},{0,0,1,2}};
 初期化するときは、列サイズを省略可能であ
り、この場合は、初期値の列サイズとなる
int a[][3] = { {1,2,3,4},{0,1,2,3},{0,0,1,2}};

アドレス計算 – 1次元配列

1次元配列の場合のアドレス計算
type a[n] ... -> a + n×sizeof (type)
例) int 型の場合
int a[n] -> a + n ×sizeof(int) = a + n*4
char 型の場合
char a[n] -> a + n×sizeof(char) = a + n*1
アドレス計算 – 2次元配列

2次元配列のアドレス計算
type a[n][m] ->
a + n×sizeof(type) + m×sizeof(type)
ポインタ配列


ポインタ配列 ... ポインタ変数の配列
ポインタ配列の宣言

例) char *argv[10]
各要素は
argv[ i ][ j ]
で示される



1次元配列
i + 1行目のj + 1列
2次元配列と
異なるのは、各行
の配列サイズが
異なる点
10
ポインタ配列の初期化
例)
char *command[]={"ls","mkdir","cd","exit"};
 配列のサイズは省略可能で、その場合も初
期値で用意したサイズが適用される

コマンドの引数 – main関数の引数
コマンドの引数は、そのコマンドのプログラムの
main関数に引数として渡される
 main関数のプロトタイプ宣言:
int main( int argc, int *argv[]);

 第1引数
 第2引数
argc ... コマンドの引数の数
*argv ... コマンド引数の文字列配列へのポイン
タ配列
 例) ls -l main.c というコマンドの場合
argc ... 3
argv[0] ... "ls"
argv[1] ... "-l"
argv[2] ... "main.c"
次回(第12回)について
12回は、演習はなし
 12回に、演習成績から優秀なものとして
期末テスト免除者を発表する
※ 期末テスト免除者はHPでも掲示予定
 12回は、これまでの話を総括したプログラミ
ングに関する話をする予定
 13回は、期末テスト
