配列
同じ型の、複数の変数を一つにまとめたもの(データ列)。
↓要素数(配列の大きさ)= 添え字
int a[4];
↑ ↑
型 配列名
初期化付宣言の方法
初期化の時だけ、まとめて数値を入れることができる。
int a[4] = {1, 2, 3, 4};
または
int a[] = {1, 2, 3, 4};//データの数を自動的に読んで要素数を決定してくれる
使い方
基本的に変数と同じ。違う点は毎回[x]で要素を指定すること。
【配列にアクセスする場合】
配列名[要素番号] ※一次元配列の場合※
array[3] で宣言した場合
①array[0]
②array[1]
③array[2]
※要素番号は、0 ~ 要素数-1 まで。特に「書き込み時」に配列外を指定してしまうとオーバーフローになるので要注意。
初期化(代入)の書き方のバリエーション
int array[3] = { 10, 20, 30}; //初期化時のみ可能
または
for(int ii = 0; ii < 3; ii++){
array[ii] = 10 * (ii+1);
}
または(カウンタ逆から回す場合)
for(int ii = 2; ii >= 0; ii--){
array[ii] = 10 * (ii-1);
または
for(int ii =3; ii >= 0; ii--){
array[ii-1] = 10 * (ii-1);
※より実用的には
const int TBL_NUM = 3;
int array[3];
for (int ii = TBL_NUM - 1; ii >= 0; ii--) {
array[ii] = 10 * (ii+1);
printf("%d\n", array[ii]);
}
配列と文字列(文字列を文字配列として扱う)
char str[] = "abc";
str[0] ⇒ 'a'
str[1] ⇒ 'b'
str[2] ⇒ 'c'
str[3] ⇒ '\0' = NULL文字が自動的に入る。
初期化付宣言
char str[4] = {'a','b','c','\0'};
文字列関数(string.hをincludeする必要あり)
●strlen() …文字列の長さを得る(\0:NULL文字は含まれない)
char str[] = "abcde";
int len = (int)strlen(str);
printf("文字列 = %d\n", len);
実行結果
文字列 = 5
●strcpy() …文字列をコピーする(strcpyは安全ではないためstrcpy_sを使う)
char str[] = "abcde";
int len = (int)strlen(str);
printf("文字列 = %d\n", len);
char buff[100];
strcpy_s(buff, str);
printf("コピーした文字列:%s\n", buff);
実行結果
文字列 = 5
コピーした文字列:abcde
●strcat() …文字列を結合する(strcatは安全ではないためstrcat_sを使う)
char str[] = "abcde";
int len = (int)strlen(str);
printf("文字列 = %d\n", len);
char buff[100];
strcpy_s(buff, str);
printf("コピーした文字列:%s\n", buff);
strcat_s(buff, "FFIIGG");
printf("結合した文字列:%s\n", buff);
実行結果
結合した文字列:abcdeFFIIGG
●strcmp() …文字列を比較する
char str[] = "abcde";
int len = (int)strlen(str);
printf("文字列 = %d\n", len);
char buff[100];
strcpy_s(buff, str);
printf("コピーした文字列:%s\n", buff);
strcat_s(buff, "FFIIGG");
printf("結合した文字列:%s\n", buff);
int val = strcmp(str, buff);
printf("比較結果=%d\n", val);
実行結果
文字列 = 5
コピーした文字列:abcde
結合した文字列:abcdeFFIIGG
比較結果=-1
valの値が0 : str と buff が等しい
valの値がプラス : strの方がbuffよりも辞書的に後(大きい)
valの値がマイナス: strの方がbuffよりも辞書的に前(小さい)
ポインタ
データの塊の先頭アドレスを格納しておく変数。
https://9cguide.appspot.com/15-01.html ←この章だけでも読んでおくべし。
int a; // 変数宣言
a = 10; // 代入
int* p1; // ポインタ変数(アドレスが入る変数)
p1 = &a; // 変数aのアドレス(例:p1の中身は0x8000)
int b = *p1; // aのアドレスに格納されている値をbに代入(b = a と同じ)
b = a; // これは b = a; なので、普通のコピー
*p1 = 12; // aのアドレスにある値を12に書き換える(a = 12 と同じ)=「間接代入」
a = 12; // 当然、これも a = 12
「アドレスを格納する変数がポインタ、*
は中身を取り出す演算子」
→ この“二重構造”を理解しておくとポインタで迷わなくなる(by ChatGPT)
コメント