C言語の入門から入門まで

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

おすすめ

転載: blog.csdn.net/JohnJill/article/details/130238290