カスタムタイプ
構造
構造の基礎知識
- 構造と配列の違い
- 構造を作成する
struct student //学生的数据类型
{
char name[10];
int age;
};
構造体ポインタと構造体配列を作成することもできます
struct student* p; //结构体指针 ++跳过一整个结构体
struct student arr[10]; // 结构体数组 存放10个
- 構造へのアクセス
注:
#include<stdio.h>
struct student
{
char name[20];
int age;
}x,*p;
int main()
{
if (p == &x)
{
printf("haha");
}
return 0;
}
ここで、
pは&xとは異なります。pは構造体ポインターですが、nullポインターであり、次の動作と同等です。
int a;
&xは、xのアドレスが構造体ポインターで保存された後にxを指す構造体ポインターです。
typedef typedefを使用すると、構造体変数名を簡略化できます
typedef struct book
{
char name[10];
int price;
} book;
int main()
{
book x[10] = {
0 };
return 0;
}
現在、本は構造タイプです。
- 構造への直接アクセス
typedef struct book
{
char name[10];
int price;
} book;
int main()
{
book x[10] = {
0 };
x[1].name[10] = "abcd"; //通过 点操作符访问
return 0;
}
- ポインタを介した間接アクセス
typedef struct
{
char name[10];
int price;
}book;
void fun(book* pc)
{
pc->price =10;
printf("%d",pc->price);
}
int main()
{
book x[10] = {
0 };
fun(x);
return 0;
}
構造体ポインタ
struct stu
{
char name[10];
int age;
};
int main()
{
struct stu *p;
return 0;
}
pは構造体へのポインタp + 1は次の構造体にジャンプできます
* p +1これは不正な操作です
* pおよびp * Pは構造体全体ですpは構造体ポインタです
#include<stdio.h>
struct stu
{
char name[10];
int age;
}x;
int main()
{
struct stu *p=&x;
p->age = 10; // 可以这样 指针指向
(*p).age=10; // 可以解引用得到 x
return 0;
}
- ネストされた構造体への構造体ポインタアクセス
#include<stdio.h>
struct stu
{
int arr[2];
int age;
};
struct ptu
{
int a;
int b;
struct stu sr ;
}s;
int main()
{
struct ptu* p = &s;
p->sr.age;
return 0;
}
構造体のメモリ割り当て
まず第一に、このコードは何を出力しますか?
struct S1
{
char c1;
int i;
char c2;
};
int main()
{
printf("%d\n", sizeof(struct S1));
return 0;
}
出力12は1+ 4 + 1 = 6であってはなりません。構造メモリの格納方法が異なることがわかります。
12. 第一个成员在与结构体变量偏移量为0的地址处。
13. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
Linux中的默认值为4
14. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
15. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍
16. 结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。
緑チャーブルー役に立たないメモリ赤int
ジョイント
ここを突いて団結する