1. C 言語では、const キーワードを使用してポインタを変更し、ポインタが指すメモリ空間へのアクセスを制限できます。
int *const ptr3 = arr;
*ptr3 = 998;
ptr3 は配列 arr を指します。ptr3 が指す要素の値は変更できますが、ptr3 が指す要素は変更できません。例: ptr = arr;×
int const *ptr = &a; //定数ターゲット ポインター、置換のみ可能ですが、値は変更できません。
ptr =&b;
2. バブルソートの便利な書き方
for (i = 0; i < 3; ++i){ // バブルソートを使用して配列をソートします
for (j = 0; j < 2 - i; ++j){
if (arr[j] > arr[j + 1])arr[j] ^= arr[j + 1] ^= arr[j] ^= arr[j + 1];
}
}
3. アレイの長さを測定します
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
4. ビット演算子
左側を破棄し、右側に 0 を追加します。
int a = 2;
int b = a << 1; // a のバイナリ ビットを 1 ビット左にシフトします。b は 4、
a : 000000000000000000000000000010
b : 0|00000000000000000000000000010+0
右側は破棄され、左側は 0 で埋められます。
int a = 10;
int b = a >> 1;
a : 000000000000000000000000001010
b : 0+000000000000000000000000000101|0
5. 負の数の保存
負の数 -1 はメモリに格納される必要があり、メモリは 2 の補数 (255 - 1) で格納されます。
6. ビット演算子
7. 構造体アクセサーの違い:
意味:
struct Student { 文字名[20]; 年齢; };
struct Student stu = {"アリス", 18};
ポイント操作: (構造体変数名を介して構造体メンバーにアクセス)
printf("名前: %s、年齢: %d\n", stu.name, stu.age);
アロー操作: (構造体ポインタを介して構造体メンバーにアクセス)
struct Student *pstu = &stu;
printf("名前: %s、年齢: %d\n"、pstu->名前、pstu->年齢);
8. ポインタの加算と減算
ワイルド ポインタを避ける, int* p = NULL; // NULL を割り当てた場合でも、どのような値を与えればよいかわからない場合に使用します
9. ポインタ減算の役割
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n", &arr[9] - &arr[0]); // ポインタとポインタの間の要素の数を取得します
10. システム エンディアンのサイズを決定する
リトル エンディアン マシンがマルチバイト データを格納する場合、下位バイトが最初に来て上位バイトが続きます。つまり、0x01020304 はリトル エンディアン マシンでは 0x04030201 として格納されます。a の下位バイトが 1 でない場合、現在のマシンのバイト オーダーがビッグ エンディアンであることを意味します。
int a = 1;
char* pa = (char*)&a; // ここでは強制的な型変換を実行する必要があります
if(*pa == 1)printf("リトルエンディアン");
else printf("ビッグエンディアン");
11. 符号なし型 unsigned____
署名付き文字の範囲は -128 ~ 127 です。
unsigned char の範囲は 0 ~ 255 です。
12. 浮動小数点数の保存
2 進浮動小数点数 V は、 (-1)^S * M * 2^Eの形式で表現できます。
① (-1)^s は符号ビットを表し、s = 0 の場合、V は正の数、s = 1 の場合、v は負の数になります。
② M は 1 以上 2 未満の有効な数値を表します。
③ 2^E は指数を意味します
例: バイナリ: 101.1 → 1.011 * 2^2 → (-1) ^0 * 1.011 * 2^2
名前を付けて保存: s=0 M=1.011 E=2
13. 配列ポインタの書き方
for(i=0; i<10; i++)
{ //以下の式はすべて同等です printf("%d ", p[i]); printf("%d ", *(p+i)); printf ( "%d ", *(arr+i)); printf("%d ", arr[i]); //arr[i] == *(arr+i) == *(p+i) = = p[i] }
ポインタの配列: int* parr1[10];
配列ポインタ: int (*parr2)[10];
配列ポインターの配列: int (*parr3[10])[5];
14. 2次元配列パラメータの受け渡し
15. 関数ポインタ
int Add(int x, int y)return x + y;
int (*pf)(int, int) = &Add; //関数ポインタ
関数ポインタの配列:
pfArr は関数ポインタの配列で、{} 内は関数名です
int (*pfArr[5])(int, int) = {NULL, Add, Sub, Mul, Div};
使用:
int 入力 =0;
for(input =1;input<5;input++) (pfArr[input])(x, y); //各関数を個別に実行
16. C言語のコールバック関数
void Calc(int (*pf)(int, int))
{ int x = 0; int y = 0; printf("2 つのオペランドを入力してください:>"); scanf("%d %d", &x, &y) ; printf("%d\n", pf(x, y)); }
使用方法: 他の関数: Calc(Add);//Add は新しい関数です
17. ポインタ使用上の注意
初期化されていない場合 : int* p = NULL; // NULL に初期化される
ポインタの逆参照: 逆参照の前に、ポインタが指すメモリ ブロックが割り当てられていることを確認する必要があります。
if (p == NULL) {return 1;}
使用後にポインタを解放します。
free(p); // メモリブロックを解放する
p = NULL; // ポインタを NULL に代入します
ポインターの型が一致していることを確認する必要があります。
int a = 10;
浮動小数点数 b = 3.14;
int* p = &a; // int 型のポインタは int 型の変数を指します
float* q = &b; // float 型のポインタは float 型の変数を指します
18. C言語操作レジスタ
レジスタのビット 6 に値 1 を割り当てます。
登録する:
19. パラメータを使用したマクロ定義
中括弧、セミコロン、演算子などの優先順位による影響を避けるため。
20. ポインタの詳しい使い方
1.
char ch = 'a';
char *p = &ch; ------->*p == p[0] ='a';
2.
char ch[] = {'a','\0'}; -----------ch は &ch[0] に等しい ------->*ch==ch[0 ]= ='a'
3.
int a;
int *p = &a;
a = 10;
*p = 9;
printf("a = %d\n", a); // 出力は 9
printf("&a = %d\n", &a); // aのアドレス、つまりメモリ上の変数aのアドレスを出力します。
printf("p = %d\n", p); // p の値、つまり a のアドレスを出力します。
printf("p = %d\n", &p); // p のアドレスを出力、32 ビット システムでは出力結果は 4、64 ビット システムでは出力結果は 8
printf("*p = %d\n", *p); // p が指す値、つまり a の値を出力し、出力結果は 9 になります
4.
int b[5] = {1, 2, 3, 4, 5};
printf("b = %d ,*b = %d, *(b+1) = %d, *(b+2) = %d\n",b, *b, *(b+1), * (b+2));
//b = -13328 、*b = 1、*(b+1) = 2、*(b+2) = 3
5. 文字列配列出力モード
char *str = "私はあなたを愛しています";
int i、長さ;
長さ = strlen(str);
for (i = 0; i < 長さ; i++)
{
printf("%c", str[i]);
}
//あなたを愛してます
6.
char arr[] = "abcdef";
char *p = arr;
printf("*p %c\n", *p); //
printf("p %c\n", p[0]); // abcdef
printf("p %s\n", p); // abcdef
printf("arr %s\n", arr); // abcdef
printf("&p %d\n", &p); //-13312