RISTイブニングスクール (応用編:第3日C)

配列とポインタ
数理情報システム工学科
担当: 汐月哲夫
2015/10/1
プログラミング方法論
[email protected]
1
配列(array)
• 配列=同じ型の連続した並び
2015/10/1
プログラミング方法論
[email protected]
2
配列の宣言
C言語の記述
(sizeof(int)X8)バイトの領域を確保
int a[8];
char b[]={“KUMA”};
文字列の初期化
(ヌル文字を含めて5文字)
a
b
2015/10/1
K U M A \0
プログラミング方法論
[email protected]
3
配列へのアクセス
C言語の記述
a[2] = 3;
3番目の要素に3を代入
printf(“%s\n”,b) ;
配列bの先頭番地を渡す
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]
printf()
2015/10/1
a
3
b
K U M A \0
プログラミング方法論
[email protected]
4
配列へのアクセス
個々の要素は基本型として扱う
a[2]
b[0]
int 型
char 型
配列変数名は先頭アドレス
b = 配列bの先頭アドレス
= b[0] のアドレス
添え字は先頭からのオフセットを表す
a[2] = *(a+2)
2015/10/1
プログラミング方法論
[email protected]
5
配列とポインタ
int a[6];
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
*(a)
*(a+1)
*(a+2)
*(a+3)
*(a+4)
*(a+5)
&a[0]
&a[1]
&a[2]
&a[3]
&a[4]
&a[5]
int 型
変数を表す
2015/10/1
(a)
(a+1)
(a+2)
(a+3)
(a+4)
(a+5)
* int 型
変数のアドレスを表す
プログラミング方法論
[email protected]
6
ポインタ変数
ポインタ変数
=変数、関数のアドレスを格納する変数
ポインタ変数の宣言
<型名> *<変数名>;
アドレスを内容とする変数
例:
ptr
int *ptr;
int a=3;
2015/10/1
ptr = &a;
a
プログラミング方法論
[email protected]
3
整数を内容とする変数
7
ポインタに関する演算子
*<ポインタ変数名>
ポインタ変数名の指す変数
&<変数名>
ポインタ変数 ptr に
整数変数 a のアドレスを
セットする
変数名のアドレス
例: int *ptr;
int a=3;
ptr = &a;
*ptr = 4;
2015/10/1
ptr
a
4
34
ptr の指す変数に 4 を代入する
プログラミング方法論
[email protected]
8
ポインタに関する演算子(2)
<ポインタ変数>+<整数>
<ポインタ変数>ー<整数>
<ポインタ変数>++
<ポインタ変数>--
例: int a[3];
ptr = a;
a
ptr
4
5
*(ptr+1) = 4;
*(ptr+2) = 5;
2015/10/1
プログラミング方法論
[email protected]
9
参照渡しの例2
メインプログラム
呼び出される
関数プログラム
#include <stdio.h>
void set(int *, int *);
int main( void )
{
int a, b;
set(&a, &b);
printf(“%d %d\n”,a,b);
return 0;
}
2015/10/1
void set(int *aptr, int *bptr)
{
*aptr = 3;
*bptr = 4;
}
プログラミング方法論
[email protected]
10
関数外の変数の内容を変更する(1)
メインプログラム
の管理するメモリ
a
b
呼び出される
関数プログラム
void set(int *aptr, int *bptr)
{
*aptr = 3;
*bptr = 4;
}
変数のアドレスが
ポインタ変数に渡される
2015/10/1
プログラミング方法論
[email protected]
11
関数外の変数の内容を変更する(2)
メインプログラム
の管理するメモリ
a
b
3
4
呼び出される
関数プログラム
void set(int *aptr, int *bptr)
{
*aptr = 3;
*bptr = 4;
}
ポインタ変数が指す変数に
値を代入する
2015/10/1
プログラミング方法論
[email protected]
12