要素 - みる会図書館


検索対象: Linux/FreeBSDで学ぶC言語
51件見つかりました。

1. Linux/FreeBSDで学ぶC言語

配列変数の要素を操作する 配列変数の個々の要素は、次のように表すことができます。 列変数名 [ 要素番号 ] たとえば、上記で宣言した配列の 5 番目の要素なら、次のように指定します。 なお、前ページで述べたように要素は 0 番から始まるので、本当は「 5 番目の要素 = point[4] 」となります。しかし、 " 0 が 1 番目 " というのは混乱の元なので、本書で は要素番号 0 の要素は 0 番目として説明することにします。 0 土 n セ [ 5 ] 配列変数の個々の要素は、一般の変数と同じように扱うことができます。たとえ ば、配列変数 p 。 int の 5 番目の要素に 50 を代入するには、次のような文を書きます。 po 土 n セ [ 5 ] 50 ・ Fig2.2 : 配列の要素に値を代入する point[O] point[l] point[2] point[3] po int[4] po int[5] point[6] point[7] ← 0 また、要素番号は変数で指定することも可能で、たとえば変数 i の値が 10 の場合、 次の文は配列の 10 番目の要素に 30 を代入することになります。 po 土 n セ [ 30 なお、宣言の際に指定した要素数よりも大きな要素番号を指定した場合、プログラ ムの実行時にエラーが発生します。たとえば「 int point[30];J と宣言したあとで、 「 p 。 int [ 50 ] = 80 : 」という文を実行すると、エラーが発生することになります。 第 2 章配列変数と構造体

2. Linux/FreeBSDで学ぶC言語

0 配列変数の初期化 配列変数では、宣言の際にすべての要素を一度に初期化することもできます。 ~ - 型名変数名 [ 要素数 ] = { 初期傅ユ , 初期値 2 , ・・・ , 初期値れ たとえば、 int 型の「 a 」という配列変数を宣言し、要素の数は 5 つにするとしまし よう。その際、各要素の初期値を「 6 」「 3 」「 7 」「 2 」「 9 」にするには、次のように記 述します。 土 n セ a [ 5 ] { 6 ′ 3 ′ 7 ′ 2 ′ 9 }; 通常の分では、「凵の後にセミコロンは付けませんが、 注意してください。 こでは付いていることに ・ Fig2.3 : 配列変数の初期化 要素の数は初期値の数で決まるので、く要素数 > の部分は省略してもかまいませ ん。たとえば、上記の宣言文は次のように書くこともできます。 土 n セ a[l { 6 ′ 3 ′ 7 ′ 2 ′ 9 }; なお、要素数を指定する場合、初期値の数と要素数が一致している必要はありませ ん。要素数が初期値の数より多ければ OK です。たとえば、 10 個の要素を持っ配列変 数を宣言し、そのうちの最初の 5 個の要素だけを初期化することもできます。 土 n セ a [ 10 ] { 6 ′ 3 ′ 7 ′ 2 ′ 9 配列変数を使う

3. Linux/FreeBSDで学ぶC言語

0 配列変数を使う それでは、実際に配列変数を使う方法を説明しましよう。 配列変数の宣言 一般の変数を宣言するには「く型名 > く変数名 > ; 」という書き方をしましたが、配 列変数を宣言するには、次のように記述します。 ~ ・型変数 [ 要素数 ることもできます。たとえば、 5 個の要素を持っ配列変数 a と、 10 個の要素を持っ配 通常の変数を宣言する場合と同様に、カンマで区切って同じ型の変数を複数宣言す 土 n セ po 土 n セ [ 30 ] ー のようにします。 たとえば、 int 型で要素が 30 個の配列変数を宣言し、名前を「 point 」にするには次 なお、 C 言語では要素の番号は 0 番から始まり、最大の要素番号は要素の数から 1 土 n セ a ー 5 ] ′ b ー になります。 また、次のように記述すると、配列変数「 a 」と一般の変数「 b 」が宣言されること 土 n セ a [ 5 し b い 01; 列変数 b を宣言するには、次のように記述します。 を引いた値になります。上記の例 (point) なら、要素番号の最大値は 29 になります。 ・ Fig2.1 : 配列変数の宣言と要素番号 ー→圄 point[O] poi nt[l ] point[2] point[29] 配列変数を使う 89

4. Linux/FreeBSDで学ぶC言語

リスト 3.9 は、 ma Ⅱ。 c 関数でメモリを確保する例です。変数 size に要素の個数を入 力したあと、 12 行目で指定した要素の分だけメモリを確保しています。その後、 for 文の繰り返しを使って、各要素に要素番号を代入しています。 ・リスト 3.9 : 確保したメモリに値を代入する (malloc. c) #include く stdio. h> #include く stdlib. h> 、 1 つ」 -4 【 0 、 6 t••— 8 0- 1 ワ】 00 -4 0 「 / 8 0- 1 ワっ 0 4 一 0 1 1 上 1 -1 11 1 -1 1- 1 亠 1 ワワワ】ワ】ワワ〕 ma i n ( ) i nt Xp i , i , S i ze; / * 要素の数を指定する * / p 「 intf("lnput size . scanf ("%d", &size) ; / * 指定した要素の分だけメモリを確保する * / : ma Ⅱ oc (s i ze * s i zeof ( i nt ) ) ; / * 各要素に要素番号を代入する * / fo 「 (i 0 ; i く S i ze; i 十十 p i [ i ] : / * 結果を表示する * / fo 「 (i : 0 ; i く s i ze ; i + + ) p 「 intf("piC%d] : %dVn", i, piCi]); なメモリを解放する * / free(pi); たとえば、要素の個数として 5 を指定すると、結果は次のようになります。 マリスト 3.9 の実行結果 $ ma110c ln セ size ? 5 p 土 [ 0 ] 0 pi [ 1 ] 1 pi [ 2 ] 2 pi[ 3 ] 3 pi[ 4 ] 4 ・・第 3 章ポインタとメモリ管理

5. Linux/FreeBSDで学ぶC言語

また、「 a 」はアドレスなので、ポインタに代入することもできます。たとえば、リ スト 3.3 のようにすると、変数 pa には a の先頭要素のアドレスが代入されることにな ります ( 6 行目 ) 。 さらに、ポインタの前に「 * 」を付けると、ポインタが指すメモリの内容を表しま す。したがって、 8 行目の文を実行すると、 pa の指すメモリ、すなわち配列変数の先 頭の要素に 5 が代入されることになります。 ・リスト 3.3 : 配列の先頭要素のアドレスをポインタに代入する (pointerl. c) main() 1 ワ」っ 0 -4 【 0 冖 / 8 9 、 int a [ 5 工 xpa; / * pa には配列変数 a の先頭の要素のアドレスが代入される x/ pa : a ; / * pa の指すメモリ ( 配列変数 a の先頭の要素 ) に 5 を代入する * / Xpa : 5 ; 配列変数 a がメモリの 1000 番地以降に保存されているとすると、 このプログラム の動作は次のようになります。 ・ Fig3.10 : リスト 3.3 の動作 998 番地 999 番地 1000 番地 a[01 1001 番地 a[l ] 1002 番地 a[2] 1003 番地 a[31 1004 番地 a[41 1005 番地 1006 番地 5 を代入 * pa なお、上記のように配列を宣言した場合、先頭の要素は「 a 回」で、そのアドレス は「 & a 回」と表すこともできます。したがって、「 a 」は「 & a 回」に等しいことにな ります。 また、 a も配列の先頭の要素のアドレスを指すので、「 *a = 5 ; 」としても、配列の 先頭の要素に 5 の代入が可能です。 配列とポインタの関係 137

6. Linux/FreeBSDで学ぶC言語

2 次元配列の初期化 2 次元配列も、宣言時に初期化できます。 1 つ目の要素の数が「 x 」、 2 つ目が「 y 」 なら、次のように書きます。 ・リスト 2.3 : 2 次元配列の初期化 く型名〉く変数名 > [ x ] [ y ] : { [ 1 ] [ 0 値 , [ 1 ] [ 1 ] の値 , , Cx]Cy] の値 }} ; たとえば、 3 回のテストの 10 人分の点数を管理するために、 2 次元配列「 point 」を 宣言するとした場合、その各要素を宣言時に初期化するには、リスト 2.4 のように書 きます ( このときの列変数の各要素の値は Fig2.5 のようになります ) 。 ・リスト 2.4 : 2 次元配列の初期化の例 int pointC3]C10] : { { 65 , 48 , 79 , 56 , 50 , 62 , 69 , 38 , 81 , 53 } , { 72 , 48 , 66 , 58 , 45 , 58 , 73 , 44 , 90 , 63 } , { 58 , 25 , 91 , 73 , 55 , 71 , 58 , 39 第 72 , 55 } } ; ・ Fig2.5 : リスト 2.4 を実行したときの配列変数の状態 要素番号 2 0 65 48 79 72 48 66 1 2 58 25 91 0 ・ 0 ・ 00 3 3 5 5 6 5 1 0 2 要素番号 1 なお、宣言の際には 1 つ目の要素番号を省略することも可能です ( 2 つ目の要素番 号は省略不可 ) 。たとえば、リスト 2.4 の場合なら、次のように宣言しても OK です。 土 n セ 0 土 n セ [ Ⅱ 10 ] 2 次元の配列変数

7. Linux/FreeBSDで学ぶC言語

・ Fig5.5 : 配列を関数に渡す 呼び出し側 メモリの状態 関数側 func(a) int func(int * p) 引数としてアドレスが渡される 0 1 0 乙 地 番 a 〇〇 p[O] = 1 0; 番地 a[2] 10 を代入 配列の要素数も渡す 配列を渡すにはポインタを使えばいいのですが、それだけでは問題があります。ポ インタを使うことで、関数に配列の先頭アドレスを渡すことはできます。しかし、先 頭アドレスだけでは配列の要素の数はわからないので、関数側では要素の個数を特定 することができないのです。 そこで、要素数を受け取るための引数を関数側に用意して、呼び出し側でそれも渡 すようにします。たとえば、関数を次のように定義して、引数 num で要素数を受け 取れるようにします。 土 n セ func(int * p, 土 n セ num) 一方、呼び出し側では次のようにして要素の数を渡します。 func(a ′ 10 ) ー 221 配列や構造体の受け渡し

8. Linux/FreeBSDで学ぶC言語

メモリの内容を直接 読み書きする fprintf 関数や fscanf 関数を使えば変数の値を読み書きできますが、メモリの内容 を直接読み書きする方が効率的なこともあります。 0 メモリの内容をファイルに書き込む : fwrite 関数 たとえば、配列変数の全要素の値をファイルに書き込みたいとした場合、 fprintf 関数では f 。 r 文の繰り返しを使って、配列の要素を 1 っすっファイルに書き込む形に なります。 しかし、このようにするより、配列の値が記憶されているメモリ領域全体をいっき にファイルに書き込む方が高速に処理できます。あるメモリ領域の内容をファイルに 書き込むには、「 fwrite 」という関数を使います。 ~ - - fwrite ( 先頭アドレス , 単位サイズ , 個数 , ストリーム ) く単位サイズ > で書き込みたいデータの 1 個あたりのサイズを、く個数 > で書き込 むデータの個数を指定します。 たとえば、「 int a [ 10 ] ; 」のように 10 個の要素を持つ int 型の配列があるとした場合、 この配列の全要素をいっきにファイルに書き込みたいとしましよう。 この場合、書き込みたいデータは int 型の数値なので、 1 個あたりのサイズは 「 sizeof(int) 」で求めることができます。また、データの個数は配列の要素数なので 「 10 」になります。メモリ領域の先頭アドレスは、配列の先頭の要素のアドレスなの で「 a 」で表すことができます。 したがって、次のように指定すれば、この配列の全要素がファイルに保存されるこ とになります。 fwrite()r s 土 zeof ( 土 n セ ) ′ 10 ′ fp); 第 4 章ファイルアクセス 180

9. Linux/FreeBSDで学ぶC言語

0 ポインタを前後に移動する ポインタはメモリのアドレスを指しますが、ポインタの値を増減することで、指し 示すメモリのアドレスを変化させることができます。 また、ポインタは配列と同じように扱うことができるので、ポインタに配列の先頭 要素 ( 0 番 ) のアドレスを代入している場合、「 pa + + ; 」のようにしてポインタの値を 1 増やすと、配列の次の要素 ( 1 番 ) のアドレスを指すことになります。 同様に、ポインタの値を 2 増やせば、 2 つ次の要素のアドレスを指すことになりま す。たとえば、ポインタ pa が配列 a の先頭要素のアドレスを指している場合、「 pa + 2 」は配列の 2 番目の要素のアドレスを指すことになります。 また、アドレスの前に「 * 」を付けると、そのアドレスのメモリの内容を指すこと になります。したがって、次のようにすると、配列変数 a の 2 番目の要素に 5 を代入 できます。 * ( pa + 2 ) 配列変数 a がメモリの 1000 番地以降に記憶されているとすると、 次のようになります。 ・ Fig3.11 : 上記の文の動作 この文の動作は a 1000 1000 pa + 2 998 番地 999 番地 1000 番地 1001 番地 1002 番地 1003 番地 1004 番地 1005 番地 1006 番地 a[01 a[l] a[2] a[3] a[41 5 を代入 なお、すでに述べたように配列変数名だけを取り出したものは、その配列の先頭要 138 第 3 章ポインタとメモリ管理 入できます。 ンタの場合と同じように「 * (a + 2 ) = 5 ; 」と書いても、配列 a の 2 番目の要素に 5 を代 素のアドレスを表します。したがって、「 a 」という名前の配列変数がある場合、ポイ

10. Linux/FreeBSDで学ぶC言語

ポインタの配列 たくさんの変数をまとめて扱うときには配列を使いますが、ポインタも変数の 1 種 なので、「ポインタの配列」を宣言することもできます。 0 ポインタ配列の宣言 ポインタ配列は、通常の配列変数と同じ書き方で宣言できます。 ~ ー型名 * 配列名 [ 要素数 ・例 : 5 つの要素を持つ int 型ポインタの配列宣言→セ *a[51; ポインタ配列の個々の要素 (a[0] など ) は、一般のポインタと同じように扱うこと ができます。たとえば、「 intx; 」のように変数 x が宣言されている場合、「 a = & x ; 」 とすると、ポインタ配列の 0 番の要素は変数 x のアドレスを指すことになります。変 数 x が 1000 番地に記憶されているとした場合、次のような状態になります。 ・ Fig3.15 : ポインタ配列の要素に変数のアドレスを代入した 一喆 998 番地 ポインタ配列 a 999 番地 ・← 1000 番地 1000 1001 番地 1002 番地 a[21 a[31 a[41 ポインタの配列 145