第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回は、期末テスト
© Copyright 2024 ExpyDoc