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。