c言語のヘッダファイル、マクロ、ポインタ

5727 ワード

#includeコマンド#includeは、ファイルに含まれるコマンドであり、主に対応するヘッダファイルを導入するために使用される.#includeの処理は簡単で、ヘッダファイルの内容をコマンドが存在する場所に挿入して、ヘッダファイルと現在のソースファイルを1つのソースファイルに接続することです.これはコピーと貼り付けの効果と同じです.includeには2つの使用方法があります.
#include 
#include "myHeader.h"
カッコ< >と二重引用符" "の違いは、ヘッダファイルの検索パスが異なることです.標準ライブラリを含むヘッダファイルはカッコ、カスタムヘッダファイルは二重引用符を推奨します.
  • 1 1つのincludeコマンドには1つのヘッダファイルしか含まれません.複数のヘッダファイルには複数のincludeコマンドが必要です.
  • ファイルには、ネストを許可するものが含まれています.すなわち、1つの含まれるファイルに別のファイルを含めることもできます.

  • マクロ定義
    #define  マクロ名  文字列#は、すべての前処理コマンドが#で始まる前処理コマンドであることを示します.defineは、前処理コマンドである. は識別子の一種であり、命名規則と識別子は同じである. は、定数、式などであってもよい.
    マクロ定義のいくつかの説明
  • マクロ定義は、マクロ名で文字列を表し、マクロ展開時にマクロ名の代わりに文字列を使用します.これは単純な置換にすぎません.文字列には任意の文字、定数、式を含めることができます.プリプロセッサは、エラーがあれば、マクロによって展開されたソースプログラムをコンパイルするときにのみ検出されます.
  • マクロ定義は、説明または文ではなく、行の最後にセミコロンを付ける必要はありません.セミコロンを付けると、セミコロンも一緒に置き換えられます.
  • マクロ定義は、マクロ定義コマンドがソースプログラムの終了となるように機能する関数の外に書かなければならない.役割ドメインを終了するには、#undefコマンドを使用します.define  A  123  #undef  A    Aは定義からundefまでの間でのみ有効である
  • マクロ定義は、データ型とtypedefでデータ説明子を定義する違いを表します.
    マクロ定義は単純な文字列置換にすぎず、前処理で完了し、typedefはコンパイル時に処理され、単純な置換ではなくタイプ説明子に名前を変更します.名前付き識別子には、タイプ定義の説明の機能があります.
    #define PIN1 int *
    typedef int *PIN2;  //     typedef int (*PIN2);
    形式的には似ているが、実際の使用では異なる.変数をPIN 1,PIN 2で説明すると、その違いがわかります.
    PIN1 a,b;
    マクロ置換後に次のようになります.
    int *a,b;
    aは整数を指すポインタ変数であり、bは整数変数であることを示す.ただし、
    PIN2 a,b;
    a,bはいずれも整数を指すポインタ変数であることを示す.PIN 2はタイプ説明子であるからである.
    この例から分かるように、マクロ定義はデータ型を表すこともできるが、結局は文字置換である.エラーを避けるために、使用時に注意してください.http://c.biancheng.net/cpp/html/65.html
     
    int a = 100;aは整数を格納するための変数であり、そのアドレスを取得するために&を前に追加する必要がある.
    char str[20] = "abcdefg";         str自体は文字列のヘッダアドレスを表し、&を追加する必要はありません.
    printf("%#X, %#X", &a, str);%#Xは16進数で出力され、プレフィックス0Xが付随することを示す.
     
    ポインタ変数の定義
    ポインタ変数の定義は、通常の変数の定義と非常に似ていますが、変数名の前にアスタリスク*を付けるには、次のようにします.
    datatype *name;またはdatatype*name=value;*はポインタ変数を表し、datatypeはポインタ変数が指すデータのタイプを表す.たとえば:
      int *p1;
    p1 intタイプのデータを指すポインタ変数であり、p 1がどのデータを指すかは、与えられた値によって決定されるべきである.次のようになります.
      int a = 100;
      int *p_a = &a;
    定義ポインタ変数p_aは同時に初期化され、変数aのアドレスが付与されるとp_aはaを指す.注目すべきは、p_a必要なアドレスは、aの前にアドレス記号&を付けなければならない.そうしないと、間違っている.
    1 //      
    2 float a = 99.5, b = 10.6;
    3 char c = '@', d = '#';
    4 //      
    5 float *p1 = &a;
    6 char *p2 = &c;
    7 //        
    8 p1 = &b;
    9 p2 = &d;
    *は、1つの変数がポインタ変数であることを示す特殊な記号であり、p 1、p 2を定義する際に*を持たなければならない.p 1,p 2に値を付与する際には,ポインタ変数であることが分かっているので,*を余計に持ち込む必要はなく,後で一般変数のようにポインタ変数を使用することができる.
    すなわち,ポインタ変数を定義する際には*を持たなければならず,ポインタ変数に値を付与する際には*を持たない.
     
     
    ポインタ変数は、int*a,*b,*c;//a、b、cのタイプはすべてint*です.
    各変数の前には*が必要です.intと書くと *a, b, c;,では,aのみがポインタ変数であり,b,cはいずれもintタイプの一般変数である.
     
     
    ポインタ変数を定義する場合の*と、ポインタ変数を使用する場合の*とでは意味がまったく異なります.次の文を例にとります.
  • int *p = &a;
  • *p = 100;

  • 1行目のコードの*は、pがポインタ変数であることを示すために使用され、2行目のコードの*は、ポインタが指すデータを取得するために使用される.なお、ポインタ変数自体に値を付与する場合は*を加算することはできません.次の文を変更します.
  • int *p;
  • p = &a;
  • *p = 100;

  • 2行目のコードのpの前に*を追加することはできません.
     
    *と&のパズルについて
    intタイプの変数aがあり、paがそのポインタを指すと仮定すると、*&a&*paはそれぞれどういう意味ですか.*&aは、*(&a)&aが変数aを取るアドレス(paに等価)を表し、*(&a)がこのアドレス上のデータ(*paに等価)を取ることを表し、迂回して原点に戻り、*&aは依然としてaに等価である.&*paは、pa指向を取得したデータ(aに等価)、&(*pa)はデータのアドレス(&aに等価)を示すため、*paはpaに等価であると理解できる.
    アスタリスク&(*pa)のまとめ
    私たちが現在学んでいる文法では、アスタリスク&*paには主に3つの用途があります.
  • は乗算を表し、例えば*は最も理解しやすい.
  • は、*のような通常の変数と区別するためにポインタ変数を定義することを表す.
  • は、取得ポインタが指すデータを表し、int a = 3, b = 5, c;  c = a * b;のような間接的な動作である.

  • int aa = 97;
    int bb = 98;
    int *paa = &aa;
    printf("%c",*paa);
    *paa = 99;
    printf("%c",paa);
    paa = bb;
    printf("%c",paa);
    実行結果   a   c   b
    転載先:https://www.cnblogs.com/ren-hang/p/9979405.html