Home

C言語の技

どこでも変数宣言

void test()
{
	int a;

	a = 10;

	{
		int b;

		b = a / 2;
		printf("b = %d\n",b);
	}

	a++;
}
上のコードのように、中カッコブロックで囲まれたところは、関数の途中であっても
変数を宣言できる。ただし変数の有効範囲はブロック内だけ。
だから
	//あるルーチン
	{
		int a,b;

		a = 10;
		b = 20;
	}
	//別のルーチン
	{
		int a,b,c;

		a = 40;
	}
というように、各ルーチンを作る時に重宝する。


ポインタを使って一括代入

struct{
	char r,g,b,code;
}color;

*(int *)&color.r = 0x01020304;
上のコードで、rに4、gに3、bに2、codeに1が入る。はず。


0で初期化

int array[100] = {0};

これで全ての要素が0で初期化されている。はず。

関数へのポインタ

int funcA(int a){
	return a;
}
int funcB(int b){
	return ++b;
}
int funcC(int c){
	return --c;
}

int (*table[])(int) = {funcA,funcB,funcC};

int main()
{
	int (*p)(int);

	p = table[0];

	printf("%d",p(20));

	p = table[1];

	printf("%d",p(10));

	return 0;
}
こんな感じ。

クラスみたいな構造体

struct{
	char *name;
	void (*draw)();
}student;

void func()
{
	printf("hello\n");
}

int main()
{
	student.draw = func;
	student.draw();

	return 0;
}
関数ポインタを使うと、このようにC++のクラスのメソッドのように使える。

ヘッダファイル

って、ただ埋め込まれるものだから、このようにも使える。
[test.h]
10,20,30,40,50,60,70,80,90,100

[test.c]
void func()
{
	int a[] = {
#include "test.h"
	};

}

マクロの再定義

をして警告がうるさいならundefを使う。
#define MAX 100

int a[MAX];

#ifdef MAX
 #undef MAX
#endif

#define MAX 200

int b[MAX];

メモリ確保

なんてしなくても、グローバル宣言した配列で済ませる。
int scratch[0x1000];

void func()
{
	int *a,*b;

	a = scratch;
	b = scratch + 100;

	*a = 20;
	*(a+1) = 30;
	*b = 40;
}

裏技

配列の使い方で
array[3] = 10;
と同じ意味である
3[array] = 10;
という書き方も出来る。


VC++でアンドゥはCTRL+Zだが、リドゥはCTRL+YだけでなくCTRL+SHIFT+Zでも出来る。
行削除はShift+Del。