C言語解惑(1)

5112 ワード

C言語解惑(1)
ここ数日、あちこちで仕事を探して、各宣伝会、キャンパスの招聘会を走っています.数回の筆記試験を経て、筆記試験の過程でいくつかの疑問を整理した.
staticの使い方
いろいろ調べた結果、staticの使い方を3つにまとめました.
  • 最も重要な使い方:
  • を隠す
    staticは変数または関数の「可視性」を制限し、変数と関数がこのファイルでのみ表示され、外部ファイルにアクセスできないようにします.例として、a.c,mainの2つのファイルがあるとする.c.
    以下a.cの内容
    char a = 'C';   //global variable
    void fun()
    {
        printf("Hello
    "
    ); }

    以下main.cの内容
    int main()
    {
        extern char a;  //extern variable 
        fun();
        printf("%c ",a);
        return 0;
    }

    プログラム実行結果:Hello C
    a.cで定義すると
    static char a = "C";
    static void fun()
    {
        printf("Hello
    "
    ); }

    それはmainです.cではaとfun()を呼び出すことができません.以上の手順は間違っています.
    このプロパティを使用すると、名前の競合を心配するよりも、同じ名前の変数と同じ名前の関数を異なるファイルで定義できます.
  • 変数の寿命を
  • 長くする
    一般変数はスタックに格納され、使用するときに空間を割り当て、使い終わったら回収されます.staticは変数を静的データ領域に格納し,プログラムの実行直後に初期化を完了し,プログラムの実行が終了するまで空間を割り当てる.これはグローバル変数と同じなので、staticの最も主要な役割はやはり非表示です.
    このプロパティを使用して、関数が何回呼び出されたかを記録するなど、カウントできます.私たちの単片機のプログラミングではflagなどを設定することができます.
  • デフォルト初期化0
  • 静的データ領域では、メモリ内のすべてのバイトのデフォルト値は0 x 00です.したがってstaticはデフォルトで0に初期化され、グローバル変数と同じになります.
    ポインタ配列と配列ポインタ
    ポインタ配列:ポインタを格納するための配列であり、本質は配列であり、配列の要素はポインタである.
    配列ポインタ:ポインタを中心語、すなわち配列を指すポインタであり、本質はポインタであり、1つの配列を指すだけである.
    定義は次のとおりです.
    int* a[2];  //    
    int (*a)[2];    //    

    次のように使用されます.
    #include 
    
    int main()
    {
        int c[2]={1,2};
        int* a[2];  //    
        int (*b)[2];    //    
        b = &c; //    b    c
        //   c        a
        for(int i = 0; i < 2; i++)
        {
            a[i] = &c[i];
        }
        //  ,     
        printf("*a[0] = %d
    "
    ,*a[0]); // 1 printf("(*b)[1] = %d
    "
    ,(*b)[1]); // 2 }

    ポインタ関数と関数ポインタ
    ポインタ関数:本質は関数ですが、関数の戻り値はポインタタイプです.
    関数ポインタ:本質はポインタですが、このポインタは関数を指します.
    定義は次のとおりです.
    int* f(int a ,int b);   //    
    int (*f)(int a ,int b); //    

    ポインタ定数と定数ポインタ
    ポインタ定数:定数を中心語とし、その本質は定数であり、ポインタタイプの定数にすぎない.簡単に言えば、このポインタは固定されたアドレスを指しており、変更できませんが、このアドレスに格納されている値は変更できます.
    定数ポインタ:ポインタを中心語とし、本質はポインタですが、このポインタは定数を指します.すなわち,指向する値は変更できないが,このポインタは変更できる.
    例:
    //    
    int* const b = &a;
    *b = 2;     //   
    b = &c;     //   
    
    //    
    const int* b = &a;
    *b = 2;     //   
    b = &c;     //   

    もう一つの定数を指すポインタ定数
    名前の通り、定数であり、オブジェクトも定数です.
    定義:const int* const b = &a;まとめ:
    以上の3つのグループのポインタについての認識が回り、よく見ると、中心語が実は後ろにあるのがポイントです.実は、これらの名詞は英語を見るとはっきりしています.例えば、
    ポインタ配列:array of points
    配列ポインタ:a point to an array