C言語の構造体定義
1構造ステートメント
struct Book
{
char name[100]; //书名
float price; //价格
}b1,b2; //全局变量
struct Book b3; //全局变量
//上面两种表示方式是相同的意思
int main()
{
struct Book b5; //做局部变量
return 0;
}
- 匿名構造タイプを実行
struct
{
int a;
char b;
float c;
//此处未完全声明变量,缺少了结构体标签
}b;
struct
{
int a;
char b;
float c;
}*ps;//结构体的指针变量,用来存储地址
- ps =&x;
この書き方は違法です。コンパイラは、これら2つの異なる書き方は2つの異なるタイプであると考えています。
2.構造の自己参照
struct Node
{
int data;
struct Node*next;
};
int main()
{
struct Node a = { 3, NULL };
struct Node b = { 5, &a };
printf("%d\n", b.data);
printf("%p\n", b.next);
system("pause");
return 0;
}
- 次のアドレスは、構造体でbが指すアドレス、つまりaのアドレスです。
- 構造が自己参照の場合、匿名の構造タイプとして記述することはできません。
typedef struct
{
int data;
Node* next;
}Node;
-
ここでのコンパイルエラーは、Nodeが最後に定義されているためですが、構造体内で呼び出されているため、不正です。
-
正しい表現は次のとおりです。
typedef struct Node
{
int data;
struct Node* next;
}Node;
3.構造変数の定義と初期化単純な構造の初期化
struct Point
{
int x;
int y;
};
int main()
{
struct Point p2 = { 1, 2 }; //定义一个局部变量p2并且给其进行赋值
printf("%d %d\n", p2.x, p2.y);
system("pause");
return 0;
}
- 構造ネストの初期化
struct Point
{
int x;
int y;
};
struct Node
{
int data;
struct Point p;
struct Node* next;
};
int main()
{
struct Node n1 = { 5, { 1, 2 }, NULL };
struct Node n2 = { 8, { 3, 4 }, &n1 };
printf("%d\n", n2.next->data);
printf("%d %d\n", n2.next->p.x, n2.next->p.y);
printf("%p\n", n2.next);
system("pause");
return 0;
}