C言語の難しい部分を攻略する

C言語 C言語

C言語で、難しいと思う部分はどこでしょうか?
個人的には全部!と言いたいところですが、
今回は、特につまづきやすいと思う箇所を積極的に使ってみて、
C言語を攻略してみようと思います。

こちらの記事で作成したフォルダ等、また使用しますので、参考にどうぞ。

サンプルコード

まずはサンプルコードです。

/* インクルードファイル */
#include <stdio.h>

/* 内部関数のプロトタイプ宣言 */
int func1(int*, int*);
int func2(int*, int*);
int func3(int*, int*);
int func4(int*, int*);

/* 構造体宣言 */
typedef struct{
	int aaa;
	int bbb;
	int (*pFunc)(int*, int*);
}HOGE;

/* グローバル変数宣言 */
HOGE default_data[]={
	{10,2,func1},
	{10,2,func2},
	{10,2,func3},
	{10,2,func4}
};

/* メイン関数 */
void main(void) {
	int sel,*aaa,*bbb;
	printf("処理番号を入力して下さい。[1~4]:");
	scanf("%d", &sel);
	if(1<=sel && sel<=4){
		aaa = &default_data[sel-1].aaa;
		bbb = &default_data[sel-1].bbb;
		printf("答えは %d\n",default_data[sel-1].pFunc(aaa,bbb));
	}else{
		printf("処理番号無し\n");
	}
};

/* 内部関数 */
int func1(int *a, int *b){
    /* 足し算 */
	return(*a+*b);
}
int func2(int *a, int *b){
    /* 引き算 */
	return(*a-*b);
}
int func3(int *a, int *b){
    /* 割り算 */
	return(*a / *b);
}
int func4(int *a, int *b){
    /* 掛け算 */
	return(*a * *b);
}

こんな感じでしょうか。
上記コードをコンパイルし、実行してください。

C言語勉強

今回のポイントとしては以下です。
①構造体
②ポインタ
③関数ポインタ

じっくりと見てみると、意外と簡単なので、まずはコードをよく見てみてください。

①構造体

最近の言語では、型宣言無しで動いたりしますが、C言語の場合、馬鹿正直なため、何から何まで先に宣言しておく必要があります。

まず、typedef structにて、構造体を型として定義します。
以降、char型やshort型等のように、HOGE型として使用できます。
そして、グローバル変数宣言時に、このHOGE型を使用してdefault_data変数を宣言し、初期化しています。

②ポインタ

メイン関数内で、ポインタ変数の*aaa*bbbを宣言しています。
このポインタ変数に、&default_data[sel-1].aaa&default_data[sel-1].bbbを代入しています。
以降、*aaaで参照するアドレスは&default_data[sel-1].aaaになります。
*bbbで参照するアドレスは&default_data[sel-1].bbbです。

③関数ポインタ

型宣言が特殊です。以下のように行います。
int (*pFunc)(int*, int*)//戻り値 (*変数名)(引数型)
代入方法は、pFunc = func1;のように行います。

構造体と組み合わせて使うことで、オブジェクト指向言語のクラスみたいな感じで使えて便利だったりします。
関係するデータと関数をまとめておくみたいな。

あとがき

他にビット演算やマクロ処理(define)等、色々ありますが、時間があったら書きたいと思います。