C言語⑬(2025/07/02)

配列

同じ型の、複数の変数を一つにまとめたもの(データ列)。

   ↓要素数(配列の大きさ)= 添え字
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)

コメント

タイトルとURLをコピーしました