c言語構造と共用体

構造

構造の基礎知識

  1. 構造と配列の違い
    ここに画像の説明を挿入します
  2. 構造を作成する
struct student  //学生的数据类型
{
    
    
	char name[10];
	int age;

};

構造体ポインタと構造体配列を作成することもできます


struct student* p; //结构体指针 ++跳过一整个结构体
struct student arr[10]; // 结构体数组 存放10个
  1. 構造へのアクセス
    ここに画像の説明を挿入します
    注:
#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を指す構造体ポインターです。


  1. typedef typedefを使用すると、構造体変数名を簡略化できます
typedef struct book
{
    
    
	char name[10];
	int price;
} book;


int main()
{
    
    
	book x[10] = {
    
     0 };
	return 0;
}

現在、本は構造タイプです。

  1. 構造への直接アクセス
typedef struct book
{
    
    
	char name[10];
	int price;
} book;


int main()
{
    
    
	book x[10] = {
    
     0 };
	x[1].name[10] = "abcd";  //通过 点操作符访问
	return 0;
}
  1. ポインタを介した間接アクセス
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;
}
  1. ネストされた構造体への構造体ポインタアクセス
#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

ジョイント

ここを突いて団結する

おすすめ

転載: blog.csdn.net/qq_45849625/article/details/115003975