私はCを初めて使用しますが、これら2つの違いは何でしょうか。
char* name;
struct book *abook;
構造体が本を構成することは知っていますが、charを使用すると*
、変数名の前にどのように配置されるのでしょうか。
TYPE * variableName、TYPE * variableName、およびTYPE*variableNameはすべて構文的に同じです。それはあなたがそれらをどのように使うかという記法の問題です。
個人的には最後の形が好きです。スターオペレーターがその右側のトークンを操作しているからです。のような宣言で
TYPE* foo, bar;
fooだけがポインタですが、barではありません。したがって、変数名のすぐ隣に星を付ける方が論理的に見えます。
Cコンパイラは、シンボル間の空白を無視するため、次のようになります。
char* name;
と同じです
char *name;
char * name;
char*name;
と
struct book *abook;
と同じです
struct book* abook;
struct book * abook;
struct book*abook;
アスタリスクは、タイプではなく、前にある変数にのみ適用されるため、変数名の横に配置するのがおそらく最適です。だからあなたがそうするなら:
int* a1, b1;
a1をintポインターとして定義し、b1をintとして定義したので、これは少し明確になります。
int *a1, b1;
charへのポインタとstructbookへのポインタの内部的な違いに関する限り、どちらも8バイトです(64ビットシステムでは4バイト-32ビットシステムでは4バイト)。あれは、
sizeof(char *)はsizeof(struct book *)と同じです。
ただし、コンパイラはそれぞれが何を指しているかに関する情報を保持しているため、1をインクリメントする(a ++)または1を逆参照する(* b)などの処理方法を認識しています。つまり、アドレスがポインタ変数に格納されている最初のバイトに加えて、関係するバイト数を知る必要があります。
a1がintを指している場合、a1 ++はさらに4バイトを指している必要があります(a1のアドレス整数値は4バイト高いはずです)。一方、a1がcharを指している場合、a1++はさらに1バイトだけを指している必要があります。
struct book
とchar
は両方のタイプです。これstruct book* abook
は、abookという名前のポインタを持つタイプbookの構造へのポインタです。
char* name
宣言は同じです。これはchar型へのポインタです。
ポインタを定義するこの方法は、ローカルスタックヒープをあまり埋めることなく、テキスト文字列を関数に渡すためによく使用されます。また、char配列全体をコピーするよりもCPUに負担がかかりません。したがって、ほとんどの場合、この文字ポインタは配列の最初の文字を指します(例char name[30];
:)
構造体の複数のインスタンスを作成する場合は、構造体の宣言にタグを付ける必要があります。宣言にタグが付けられている場合、そのタグは後で構造体のインスタンスの定義で使用できます。例えば:
struct book b;
structpoint型の構造体である変数ptを定義します。
struct book
あなたのタイプです。これで、このタイプへのポインターを定義できます。
それでも混乱する場合は、typedef
この構造の新しいタイプを定義するために使用します。
typedef struct book Book;
typedef struct book* BookPtr;
BookPtr
これは最初の変数にのみ影響することを覚えておいてください。