C言語の基礎Ⅰ(pdfファイル)

C言語の 基礎Ⅰ
C言語の基礎Ⅰ
0.目次
1.はじめに
1.1
1.2
簡単な例
C言語プログラムの翻訳と実行
2.条件分岐
2.1
2.2
if文
switch文
3.制御構造
3.1
3.2
3.3
3.4
while文
for文
do文
continue文,break文
4.変数、配列
4.1
4.2
4.3
4.4
変数
1次元配列
2次元配列
局所変数の有効範囲
- 1 -
C言語の 基礎Ⅰ
1.はじめに
1.1
簡単な例
簡単な例(ソースプログラム)でC言語を紹介する。
[例1]出力
1
プログラム
/* << a001.c >> */
2
#include <stdio.h>
3
int main() {
4
5
}
printf("sample\n");
解説
・ 注 釈 は /*と */で 囲 み 、 2 行 以 上 に わ た っ て も
よい。
・空行はプログラム中どこにでも入れることが
でき、プログラムを見やすくするために使わ
れる。
・ st dio .h と い う 名 前 の フ ァ イ ル を プ ロ グ ラ ム
中に取り込む。
・このファイルには入出力関係の規則などが
書かれており、プログラム中で使う命令が
うまく動作するように設定する。
stdio.hの よ う に 「 .h」 を つ け た フ ァ イ ル を
ヘッダファイルという。
・Cのプログラムはいくつかの関数から構成
さ れ 、 実 行 は mainと い う 名 前 の 関 数 か ら
始まる。
・関数を構成する文(コンピュータに指示を
与 え る 基 本 単 位 で 、 必 ず セミコロンで 区 切 る ) は
{と }で 囲 む 。 こ の 部 分 を 関 数 の 本 体 と い う 。
・ 画 面 に 文 字 列 sampleと 出 力 す る 。
\nは 改 行 を 意 味 す る 。printfも 関 数 の ひ と つ 。
ソースプログラムの作成
/* << a001.c >> */
#include <stdio.h>
int main() {
printf("sample\n");
}
ソースプログラムのコンパイル
% cc a001.c
ソースプログラムの実行
% ./a.out
sample
- 2 -
C言語の 基礎Ⅰ
[例2]計算処理
1
2
3
4
プログラム
/* << a002.c >> */
#include <stdio.h>
int main() {
int a,b;
5
6
a = 123;
b = 2 * a;
7
printf("%d %d\n",a,b);
8
}
解説
・プログラム実行中に値が変わるデータを
変数という。変数には名前をつけること
ができ、それを変数名という。
・プログラム中の変数は、すべて関数の
本体の始めで宣言しておかなければなら
ない。そのための文を宣言文という。
・変数がとる値は決められており、整数型
と浮動小数点型がある。整数型には
int型 ,short型 ,long型 が あ る 。
int型 は 、 -32768~ 32767 ま た は
-2147483648~ 2147483647
short型 は 、 -32768~ 32767
long型 は 、 -2147483648~ 2147483647
・代入文(変数=式)という。
・=は、右辺の計算結果を左辺の変数に
代入する。
・ %dは 対 応 す る 変 数 の 値 を 出 力 す る た め の
形 式 で 変 換 仕 様 と い う 。 変 換 仕 様 %dは 対
応する整数型の変数と同じ桁数の欄がと
られ、その中に値が出力される。
ソースプログラムの作成
/* << a002.c >> */
#include <stdio.h>
int main() {
int a,b;
a = 123;
b = 2 * a;
printf("%d %d\n",a,b);
}
ソースプログラムのコンパイル
% cc a002.c
ソースプログラムの実行
% ./a.out
123 246
- 3 -
C言語の 基礎Ⅰ
[例3]入力
1
2
3
プログラム
/* << a003.c >> */
#include <stdio.h>
#define MAX 1000
4
5
6
int main() {
int a;
scanf("%d",&a);
7
8
9
a = MAX * a;
printf("a=%8d \n",a);
}
解説
・記号名または記号変数を定義する。
プ ロ グ ラ ム 中 の MAXと い う 文 字 列 を
す べ て 1000に 置 き 換 え る 。
・記号名は大文字を使う習慣がある。
この機能により、プログラムが分かり
やすくなる。
また、プログラムの変更が容易にできる
・ %dは 対 応 す る 変 数 の 値 を 入 力 す る た め の
形式で変換仕様という。
変 換 仕 様 %dは 、 入 力 を 整 数 と み な し 、
対応する整数型の変数に値を代入する。
&aと 書 く こ と に 注 意 。
・ 変 換 仕 様 %8dは 8桁 の 欄 を と り 、
右寄せで変数の値を出力する。
ソースプログラムの作成
/* << a003.c >> */
#include <stdio.h>
#define MAX 1000
int main() {
int a;
scanf("%d",&a);
a = MAX * a;
printf("a=%8d \n",a);
}
ソースプログラムのコンパイル
% cc a003.c
ソースプログラムの実行
% ./a.out
123
a= 123000
- 4 -
C言語の 基礎Ⅰ
[例4]計算処理
1
2
3
4
プログラム
/* << a004.c >> */
#include <stdio.h>
int main() {
float x,y;
5
scanf("%f",&x);
6
7
y = x * x;
printf("x=%f\n",x);
8
printf("y=%10.3f\n",y);
9
}
解説
・ 浮 動 小 数 点 型 に は 、 float型 と double型
が あ る 。 float型 は 、 有 効 数 字 が お よ そ
10進 6桁 ぐ ら い で 10の -37乗 か ら 10の 38乗
の範囲の数を扱うことができる。
double型 は 、 有 効 数 字 の 桁 数 お よ び 範 囲
が float型 よ り も 大 き い 。
・ %fは 対 応 す る 変 数 の 値 を 入 力 す る た め の
形式で変換仕様という。
変 換 仕 様 %fは 、 入 力 を 10進 浮 動 小 数 点 数
とみなし、対応する浮動小数点型の変数
にその値を代入する。
・ 変 換 仕 様 %fは 、 浮 動 小 数 点 数 を 10進 数 に
変 換 し 、 小 数 点 以 下 6桁 で 表 す の に 必 要
な欄をとり、そこに出力する。
・ 変 換 仕 様 %10.3fは 、 浮 動 小 数 点 数 を 10進
数 に 変 換 し 、 10桁 の 欄 を と り 、 小 数 点 以
下 3桁 で 出 力 す る 。
ソースプログラムの作成
/* << a004.c >> */
#include <stdio.h>
int main() {
float x,y;
scanf("%f",&x);
y = x * x;
printf("x=%f\n",x);
printf("y=%10.3f\n",y);
}
ソースプログラムのコンパイル
% cc a004.c
ソースプログラムの実行
% ./a.out
1.2
x=1.200000
y=
1.440
- 5 -
C言語の 基礎Ⅰ
1.2
C言語プログラムの翻訳と実行
ccコ マ ン ド で ソ ー ス プ ロ グ ラ ム の 翻 訳 と リ ン ク ま で 行 い 、 実 行 可 能 プ ロ グ ラ ム
を作成する。手順は次のようになる。
(1)プリプロセス
プ リ プ ロ セ ッ サ が 起 動 さ れ 、 #で 始 ま る 行 が 処 理 さ れ る 。
#で 始 ま る 行 は プ リ プ ロ セ ッ サ へ の 指 示 で あ る 。
#で 始 ま る 行 は ソ ー ス プ ロ グ ラ ム の ど こ に 現 れ て も よ い 。
#includeや #defineな ど の 文 が 展 開 さ れ る 。
入力
ソ ー ス プ ロ グ ラ ム ( x.c)
出力
標 準 出 力 (通 常 画 面 )
コ マ ン ド % cc -E フ ァ イ ル 名
(2)コンパイル
コンパイラを起動する。
入力
ソ ー ス プ ロ グ ラ ム ( x.c)
出力
ア セ ン ブ ラ プ ロ グ ラ ム ( x.s)
コ マ ン ド % cc -S フ ァ イ ル 名
(3)アセンブル
アセンブラを起動する。
入力
ソ ー ス プ ロ グ ラ ム ( x.c)
出力
オ ブ ジ ェ ク ト プ ロ グ ラ ム ( x.o)
コ マ ン ド % cc -c フ ァ イ ル 名
(4)リンク
ローダを起動する。
作成されたオブジェクトプログラムと、C言語ライブラリ
を連結して実行可能プログラムを作成する。
入力
ソ ー ス プ ロ グ ラ ム ( x.c)
出力
実 行 可 能 プ ロ グ ラ ム ( a.out)
コ マ ン ド % cc フ ァ イ ル 名
- 6 -
C言語の 基礎Ⅰ
●define文
define文 で 、 文 字 列 や 式 の 置 換 が 行 え る 。
1
2
3
4
5
6
7
8
9
10
/* << dp111.c >> */
#include <stdio.h>
#define MAX 1000
/* 文 字 列 の 置 換 */
#define INPUT(a,b) scanf("%d%d",&a,&b) /* 式 の 置 換 */
#define OUTPUT(a,b) printf("%d %d\n",a,b) /* 式 の 置 換 */
main() {
int a,b;
INPUT(a,b);
OUTPUT(a+b,MAX);
}
実行結果
% cc -E dp111.c
<<途中省略>>
main() {
int a,b;
scanf("%d%d",&a,&b);
printf("%d %d\n",a+b,1000);
}
% cc dp111.c
% ./a.out
12 345
357 1000
コ ン パ イ ラ の オ プ シ ョ ン か ら 、「 #define 名 前 値 」 と 同 等 の こ と が で き る 。
%cc -D名 前 =値 フ ァ イ ル 名
1
2
3
4
5
6
/* << dp112.c >> */
#include <stdio.h>
main() {
int a=234;
printf("%d \n",a+MAX);
}
実行結果
% cc dp112.c
dp112.c: In function ‘ main’ :
dp112.c:5: error: ‘ MAX’ undeclared (first use in this function)
dp112.c:5: error:(Each undeclared identifier is reported only once
dp112.c:5: error: for each function it appears in.)
% cc -DMAX=1000 dp112.c
% ./a.out
1234
- 7 -
C言語の 基礎Ⅰ
●include文
include文 で ヘ ッ ダ フ ァ イ ル の 取 り 込 み を 行 う 。
ヘッダファイルには定数や型の宣言などが記述され、複数のソースプログラム
か ら 参 照 さ れ る 。 フ ァ イ ル 名 に は 拡 張 子 と し て .hが つ け ら れ る 。
<フ ァ イ ル 名 >の 場 合 : 標 準 の デ ィ レ ク ト リ (/usr/include)か ら 探 す 。
"フ ァ イ ル 名 "の 場 合 : (1)ソ ー ス フ ァ イ ル の あ る デ ィ レ ク ト リ 、
(2)-Iオ プ シ ョ ン で 指 定 し た デ ィ レ ク ト リ 、
(3)標 準 の デ ィ レ ク ト リ
の順に探され初めて見つかったものが採用される。
1
2
3
4
5
6
7
8
/* << dp121.c >> */
#include <stdio.h>
#include "dp121.h"
main() {
int a;
scanf("%d",&a);
printf("a = %d MAX = %d \n",a,MAX);
}
実行結果
標準ディレクトリの確認。
% cd /usr/include
% ls -l stdio.h
-rw-r--r-- 1 root root 31568 11月 21 13:09 2012 stdio.h
ホームディレクトリに移動。
% cd
% ls
dp121.c
% cc dp121.c
dp121.hが 見 つ か ら な い と い う エ ラ ー メ ッ セ ー ジ が で る 。
dp121.c:3:19: error: dp121.h: そ の よ う な フ ァ イ ル や デ ィ レ ク ト リ は あ
りません
dp121.c: In function ‘ main’ :
dp121.c:7: error: ‘ MAX’ undeclared (first use in this function)
dp121.c:7: error: (Each undeclared identifier is reported only once
dp121.c:7: error: for each function it appears in.)
ヘ ッ ダ フ ァ イ ル (dp121.h)の 作 成 。
% cat > dp121.h
#define MAX 1000
^d
% cat dp121.h
#define MAX 1000
ヘ ッ ダ フ ァ イ ル (dp121.h)の 確 認 。
% ls
dp121.c
dp121.h
% cc dp121.c
% ./a.out
123
a = 123 MAX = 1000
- 8 -
C言語の 基礎Ⅰ
2.条件分岐
2.1
if文
if文 は 一 般 に つ ぎ の よ う に 書 く 。
書き方
意味
if(条 件 ) 文
条件が真の場合、文が実行される。
真
条件
偽
文
書き方
意味
if(条 件 ) 文 1 else 文 2
条 件 が 真 な ら ば 文 1が 、 偽 な ら ば 文 2が 実 行 さ れ る 。
真
条件
偽
文2
書き方
意味
文1
if(条 件 1)
文1
else if(条 件 2)
文2
else
文3
条 件 1が 真 な ら ば 文 1が 実 行 さ れ 、 条 件 1が 偽 で し か も 条 件 2が
真 の と き 、 文 2が 実 行 さ れ る 。
条 件 1も 条 件 2も 偽 の と き 、 文 3が 実 行 さ れ る 。
- 9 -
C言語の 基礎Ⅰ
偽
条件1
真
偽
文1
条件2
真
文2
文3
[ 例 ] 1+2+… +10を 求 め る 。
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
int i,s;
s = 0; i = 1;
loop:
if( i <= 10 ) {
s = s + i; i = i + 1;
goto loop;
}
printf("s=%d\n",s);
}
( 注 意 ) 文 に は loopの よ う な 名 札 を
つけることができる。
goto文 で 、 名 札 ( loop) の
ついた文へ飛び越す。
条件には値の大小を比較する関係式や論理式がよく用いられる。
た と え ば 、 a==b, a*b<=c*d, (1<=a)&&(a<=n) な ど で あ る 。
==や <=を 関 係 演 算 子 と い い 、 つ ぎ の 6種 類 あ る 。
a
a
a
a
a
a
< b
<= b
== b
!= b
>= b
> b
aが bよ り 小 さ い
aが bよ り 小 さ い か 等 し い
aが bと 等 し い
aが bと 等 し く な い
aが bよ り 大 き い か 等 し い
aが bよ り 大 き い
&&を 論 理 演 算 子 と い い 、 つ ぎ の 3種 類 あ る 。
a && b
a || b
!a
条 件 a,bが と も に 真 の と き に 限 り 真 に な り 、
他の場合は偽になる。
条 件 a,bが と も に 偽 の と き に 限 り 偽 に な り 、
他の場合は真になる。
条 件 aが 真 の と き 偽 、 偽 の と き 真 に な る 。
(注意)論理演算子は関係演算子よりも先に評価される。
- 10 -
C言語の 基礎Ⅰ
2.2
switch文
switch文 は 一 般 に つ ぎ の よ う に 書 く 。 分 岐 が 多 く な る と 便 利 で あ る 。
書き方
意味
switch(式 ) {
case 定 数 1:
文1;
break;
case 定 数 2:
文2;
break;
……
case 定 数 n:
文n;
break;
default:
文n+1;
break;
}
式 の 値 に 応 じ て 、 定 数 i( 1≦ i ≦ n ) の と こ ろ へ 分 岐 し
文iを実行する。
break文 を 実 行 す る と 、 switch文 は 終 了 す る 。
式 の 値 が ど の 定 数 iと も 一 致 し な い と き 、 defaultの
ところへ分岐し、文n+1を実行する。
式
定数1
文1
定数2
文2
定数n
文n
default
文n+1
[ 例 ] 1,2,3の 数 値 を 読 み 込 み 、 そ れ ぞ れ の 英 単 語 を 表 示 す る 。
1,2,3以 外 の 数 値 の 場 合 は 、 ?を 表 示 す る 。
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
int a;
scanf("%d",&a);
switch( a ) {
case 1: printf("one \n"); break;
case 2: printf("two \n"); break;
case 3: printf("three \n"); break;
default: printf("? \n"); break;
}
}
- 11 -
C言語の 基礎Ⅰ
3.制御構造
3.1
while文
while文 は 一 般 に つ ぎ の よ う に 書 く 。
書き方
意味
while(条 件 ) 文
条件が真の間、文を実行し偽になるまで繰り返す。
最初から条件が偽の場合には、文は1回も実行されない。
こ の よ う な 構 造 を whileル ー プ と い う 。
偽
条件
真
文
[ 例 ] 1+2+… +10を 求 め る 。
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main() {
int i,s;
s = 0; i = 1;
while( i <= 10 ) {
s = s + i; i = i + 1;
}
printf("s=%d\n",s);
}
- 12 -
C言語の 基礎Ⅰ
3.2
for文
for文 は 一 般 に つ ぎ の よ う に 書 く 。
書き方
意味
for(初 期 設 定 ; 条 件 ; 更 新 ) 文
まず初期設定が行われる。そして条件が真ならば文が実行され
更新が実行される。その後条件が真の間、文と更新が実行され
条 件 が 偽 に な る と 文 を 実 行 せ ず に for文 の つ ぎ の 文 を 実 行 す る 。
最初から条件が偽の場合、文は1回も実行されない。
こ の よ う な 構 造 を forル ー プ と い う 。
初期設定
偽
条件
真
文
更新
[ 例 ] 1+2+… +10を 求 め る 。
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main() {
int i,s;
s = 0;
for( i=1; i<=10; i++ ) {
s = s + i;
}
printf("s=%d\n",s);
}
( 注 意 ) i++は 、 変 数 iに 1を 加 え る こ と を 意 味 す る 。
- 13 -
C言語の 基礎Ⅰ
3.3
do文
do文 は 一 般 に つ ぎ の よ う に 書 く 。
書き方
意味
do 文 while(条 件 );
まず、文が1回実行される。
条件が真の間、文を実行し偽になるまで繰り返す。
文は少なくとも1回実行される。
こ の よ う な 構 造 を 、 do-whileル ー プ と い う 。
文
真
条件
偽
[ 例 ] 1+2+… +10を 求 め る 。
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
int i,s;
s = 0; i = 1;
do {
s = s + i; i = i + 1;
}
while( i<=10 );
printf("s=%d\n",s);
}
- 14 -
C言語の 基礎Ⅰ
3.4
continue文,break文
whileや forな ど の ル ー プ か ら 抜 け 出 す と き に 、 break文 や continue文 を 使 う 。
break文 を 実 行 す る と 、 こ の break文 を 含 む 最 も 内 側 の ル ー プ を 終 了 し 、
つぎの文を実行する。
書き方
意味
while(条 件 1 ) {
文1;
while(条 件 2 ) {
文2;
if(条 件 3 ) { break; }
文3;
}
文4;
}
条 件 3 が 真 に な る と 、 break文 が 実 行 さ れ 文 4 が 実 行 さ れ る 。
偽
条件1
真
文1
偽
最
も
内
側
の
ル
|
プ
条件2
真
文2
真
条件3
偽
文3
文4
- 15 -
C言語の 基礎Ⅰ
● break文 の 例
1
2
3
4
5
6
7
8
9
10
11
12
13
/* << ba341a.c >> */
#include <stdio.h>
int main() {
int i,j;
for( i=1; i<=3; i++ ) {
for( j=1; j<=3; j++ ) {
printf("(1) i=%d j=%d\n",i,j);
if( i+j == 5 ) { printf("break\n"); break; }
}
printf("(2) i=%d j=%d\n",i,j);
}
printf("(3) i=%d j=%d\n",i,j);
}
実行結果
% cc ba341a.c
% a.out
(1) i=1 j=1
(1) i=1 j=2
(1) i=1 j=3
(2) i=1 j=4
(1) i=2 j=1
(1) i=2 j=2
(1) i=2 j=3
break
(2) i=2 j=3
(1) i=3 j=1
(1) i=3 j=2
break
(2) i=3 j=2
(3) i=4 j=2
- 16 -
C言語の 基礎Ⅰ
● goto文 で 一 気 に 複 数 の ル ー プ を 抜 け る こ と が で き る 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* << ba341b.c >> */
#include <stdio.h>
int main() {
int i,j;
for( i=1; i<=3; i++ ) {
for( j=1; j<=3; j++ ) {
printf("(1) i=%d j=%d\n",i,j);
if( i+j == 5 ) { printf("goto next\n"); goto next; }
}
printf("(2) i=%d j=%d\n",i,j);
}
next:
printf("(3) i=%d j=%d\n",i,j);
}
実行結果
% cc ba341b.c
% a.out
(1) i=1 j=1
(1) i=1 j=2
(1) i=1 j=3
(2) i=1 j=4
(1) i=2 j=1
(1) i=2 j=2
(1) i=2 j=3
goto next
(3) i=2 j=3
- 17 -
C言語の 基礎Ⅰ
continue文 が 実 行 さ れ る と 、 こ の continue文 を 含 む 最 も 内 側 の ル ー プ の
残りの部分を無視して、条件の部分を調べる。
書き方
意味
while(条 件 1 ) {
文1;
while(条 件 2 ) {
文2;
if(条 件 3 ) { continue; }
文3;
}
文4;
}
条 件 3 が 真 に な る と 、 continue文 が 実 行 さ れ 文 3 は 実 行 さ れ ず
条件2が調べられる。
偽
条件1
真
文1
偽
条件2
最
も
内
側
の
ル
|
プ
真
文2
真
条件3
偽
文3
文4
- 18 -
C言語の 基礎Ⅰ
● continue文 の 例
1
2
3
4
5
6
7
8
9
10
11
12
13
/* << ba341c.c >> */
#include <stdio.h>
int main() {
int i,j;
for( i=1; i<=3; i++ ) {
for( j=1; j<=3; j++ ) {
printf("(1) i=%d j=%d\n",i,j);
if( i+j == 5 ) { printf("continue\n"); continue; }
}
printf("(2) i=%d j=%d\n",i,j);
}
printf("(3) i=%d j=%d\n",i,j);
}
実行結果
% cc ba341c.c
% a.out
(1) i=1 j=1
(1) i=1 j=2
(1) i=1 j=3
(2) i=1 j=4
(1) i=2 j=1
(1) i=2 j=2
(1) i=2 j=3
continue
(2) i=2 j=4
(1) i=3 j=1
(1) i=3 j=2
continue
(1) i=3 j=3
(2) i=3 j=4
(3) i=4 j=4
- 19 -
C言語の 基礎Ⅰ
4.変数、配列
4.1
変数
int a で 変 数 aの 宣 言 を す る 。
変 数 aの 値 を 保 存 す る 記 憶 領 域 の 位 置 ( 番 地 ) が 決 定 さ れ る 。
変 数 aに 対 応 づ け ら れ る 番 地 を 参 照 す る に は 、 &a と す る 。
1
2
3
4
5
6
7
8
9
10
番地
記憶領域
&a
aの 値
#include <stdio.h>
int main() {
int a;
a = 123;
printf(" a = %d \n",a);
printf("&a = %x \n",&a); /* 16進 数 で 出 力 。 */
a = -a;
printf(" a = %d \n",a);
printf("&a = %x \n",&a);
}
実行結果
a
&a
a
&a
=
=
=
=
123
effffb84
-123
effffb84
- 20 -
C言語の 基礎Ⅰ
4.2
1次元配列
変数を多く使うとき、そのつど名前を考えなければならないとしたら困ってし
まう。そこで、数学で使われる数列と同様の記法を考える。同じ型のデータを順
に並べたものを配列という。配列はひとつの名前(配列名)をもつ。
各 デ ー タ を 配 列 要 素 と い い 、 配 列 名 の 後 に 添 字 を [と ]で 囲 ん で 示 す 。 添 字 は 0
から始まる。
配 列 要 素 a[i]の 番 地 は &a[i]で 参 照 す る 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* << ba421.c >> */
#include <stdio.h>
int main() {
int i;
int a[9]; /* 配 列 名 を aと し 、 9個 の 配 列 要 素
a[0],a[1],...,a[8]を 宣 言 す る 。 */
a[0] = 1; a[1] = 1;
for( i=2; i<=8; i++ ) {
a[i] = a[i-1] + a[i-2];
}
for( i=0; i<=8; i++ ) {
printf("a[%2d] = %3d
",i,a[i]);
printf("&a[%2d] = %x \n",i,&a[i]);
}
}
実行結果
% cc ba421.c
% ./a.out
a[ 0] =
1
&a[ 0] = e2a59eb0
a[ 1] =
1
&a[ 1] = e2a59eb4
a[ 2] =
2
&a[ 2] = e2a59eb8
a[ 3] =
3
&a[ 3] = e2a59ebc
a[ 4] =
5
&a[ 4] = e2a59ec0
a[ 5] =
8
&a[ 5] = e2a59ec4
a[ 6] = 13
&a[ 6] = e2a59ec8
a[ 7] = 21
&a[ 7] = e2a59ecc
a[ 8] = 34
&a[ 8] = e2a59ed0
実行ごとに割り当てられる番地は異なる。
% ./a.out
a[ 0] =
1
&a[ 0] = f3419ed0
a[ 1] =
1
&a[ 1] = f3419ed4
a[ 2] =
2
&a[ 2] = f3419ed8
a[ 3] =
3
&a[ 3] = f3419edc
a[ 4] =
5
&a[ 4] = f3419ee0
a[ 5] =
8
&a[ 5] = f3419ee4
a[ 6] = 13
&a[ 6] = f3419ee8
a[ 7] = 21
&a[ 7] = f3419eec
a[ 8] = 34
&a[ 8] = f3419ef0
- 21 -
( 注 意 ) int型 は 4 バ イ ト
必要とすること
から番地は4ずつ
増加する。
C言語の 基礎Ⅰ
4.3
2次元配列
int a[m][n]と 宣 言 す る と 、
a[0][0],a[0][1],...,a[0][n-1]
a[1][0],a[1][1],...,a[1][n-1]
...
a[m-1][0],a[m-1][1],...,a[m-1][n-1]
の mn個 の 配 列 要 素 が 決 定 さ れ る 。
配 列 要 素 a[i][j]の 番 地 は &a[i][j]で 参 照 す る 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* << ba431.c >> */
#include <stdio.h>
int main() {
int a[3][3],i,j; /* 配 列 aの 宣 言 。 */
a[0][0]=0; a[0][1]=1; a[0][2]=2;
a[1][0]=10; a[1][1]=11; a[1][2]=12;
a[2][0]=20; a[2][1]=21; a[2][2]=22;
for( i=0; i<=2; i++ ) {
for( j=0; j<=2; j++ ) {
printf("a[%d][%d]=%d
",i,j,a[i][j]);
printf("&a[%d][%d]=%x \n",i,j,&a[i][j]);
}
}
}
実行結果
a[0][0]=0
a[0][1]=1
a[0][2]=2
a[1][0]=10
a[1][1]=11
a[1][2]=12
a[2][0]=20
a[2][1]=21
a[2][2]=22
&a[0][0]=effffb64
&a[0][1]=effffb68
&a[0][2]=effffb6c
&a[1][0]=effffb70
&a[1][1]=effffb74
&a[1][2]=effffb78
&a[2][0]=effffb7c
&a[2][1]=effffb80
&a[2][2]=effffb84
(注意)行優先で番地が割り当てられている。
- 22 -
C言語の 基礎Ⅰ
4.4
局所変数の有効範囲
ブ ロ ッ ク ({}で 囲 ま れ た 部 分 )内 で 宣 言 さ れ た 変 数 ( 局 所 変 数 ) は そ の 内 部 で の
み有効である。すなわち、ブロック1内にブロック2が定義されているとき、
{
ブロック1
{
ブロック2
}
}
(1)ブロック1で宣言された変数は、ブロック2で同じ名前で宣言されない
限り有効である。
( 2 )ブ ロ ッ ク 2 で 同 じ 名 前 で 宣 言 さ れ る と 、新 た に 宣 言 さ れ た 方 が 優 先 す る 。
●(1)の例
1
2
3
4
5
6
7
8
9
10
11
12
13
/* << ba441a.c >> */
#include <stdio.h>
int main() {
int a;
a = 111;
printf("mainブ ロ ッ ク 内 : a=%d\n",a);
{
printf(" サ ブ ブ ロ ッ ク 内 : a=%d\n",a);
a = 222;
printf(" サ ブ ブ ロ ッ ク 内 : a=%d\n",a);
}
printf("mainブ ロ ッ ク 内 : a=%d\n",a);
}
実行結果
mainブ ロ ッ ク 内 : a=111
サ ブ ブ ロ ッ ク 内 : a=111
サ ブ ブ ロ ッ ク 内 : a=222
mainブ ロ ッ ク 内 : a=222
- 23 -
C言語の 基礎Ⅰ
●(2)の例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* << ba441b.c >> */
#include <stdio.h>
int main() {
int b;
b = 111;
printf("mainブ ロ ッ ク 内 : b=%d\n",b);
{
int b;
printf(" サ ブ ブ ロ ッ ク 内 : b=%d\n",b);
b = 222;
printf(" サ ブ ブ ロ ッ ク 内 : b=%d\n",b);
}
printf("mainブ ロ ッ ク 内 : b=%d\n",b);
}
実行結果
mainブ ロ ッ ク 内 : b=111
サ ブ ブ ロ ッ ク 内 : b=0
サ ブ ブ ロ ッ ク 内 : b=222
mainブ ロ ッ ク 内 : b=111
- 24 -