c语言学习日记--结构体类型未完成

一、结构体

①概念

  • 结构体是一种构造类型(由多种类型拼多多而成)
  • 结构体和数组一样,可以存放多个数据变量(称为成员),和数组不同的是它可以存放不同类型成员

②结构体变量的使用(定义、赋值、初始化、打印、传参、返回值、这种类型的数组类型、这种类型的指针类型、等等)

  1. 声明结构体对应的类型
  2. 根据声明好的结构体类型,定义对用的结构体变量
  3. 给结构体变量赋值
  4. 打印、传参、赋值……

③结构体变量的类型声明

关键字 struct:结构体标识符

struct 类型名称{   

char name[ 10];

int numbei[5];

 int age;

char sex;

 };

在代码中,类型声明后,用struct 标识符表示该结构的类型

struct xxx;表示上面声明的结构体类型

④定义结构体变量

struct xxx yyy;yyy是结构体变量

⑤结构体变量的赋值

  struct XXX yyy;
  xxx        yyy;
  yyy = XXX;
  strcpy(yyy.name,XXX.name);

⑤结构体的特殊表达

在声明结构体类型的时候,可以间接定义结构体变量:
第一种:
    struct XXX
    { 
        char name[10];
        int  num[5];
        int  age;
        char sex;
    }LDJ,ZSM;  
    
第二种:
    struct XXX
    { 
        char name[10];
        int  num[5];
        int  age;
        char sex;
    }LDJ = {"李大蕉"....},ZSM = {"周树苗"...};  
    
第三种:
​
    struct 少了这个东西  
    { 
        char name[10];
        int  num[5];
        int  age;
        char sex;
    }LDJ = {"李大蕉"....};  //不在被调用创建新的就够变量
    
第四种:
    typedef:给数据类型去花名。 
    int去新的名字:my_int;
    typedef int my_int;   // my_int表示int
    --------------------------------
    typedef struct XXX{ char name[10];int  num[5];int  age; char sex;} xxx;
    xxx a;定义变量
    xxx 表示 struct XXX

⑥ 结构体的大小

1)可以手动认为设置结构体大小:位域 和字节数对齐。(拓展)//搞搞
2)默认的计算方式
​
    struct xxx
    {
        int   a;
        short b;
        char  c;
    }XXX;
计算大小的要点:
第一个要点:结构体的首地址一定要是结构体中最胖成员的大小的整数倍。(把结构体的首地址假设为0x00000)
printf("%p---%p\n",&xxx,&(xxx.a)); 
第二个要点:
        要和自身的地址为要和自己的大小形成整数倍关系
        自己的地址%自己的大小 == 0 
        
第三个要点:
        计算出来的结构体大小一定要是结构体中最宽成员的大小的整数倍。

 

1)特殊:

struct student
{
    char mane[10];
    int age;
    struct dd
    {
        int* p;
        char a;
    };
    char sex;
}s1;
​
注意:
计算结构体的大小时,注意算到小结构体的最后一个成员时,注意满不满足小结构体的大小是不是最宽成员大小的整数倍。

⑦结构体变量传参

#include <stdio.h>
typedef struct student
{
	int  number;
	char name[10];
	int  age;
}S_S;

int Fun(S_S XM);


int main()
{
	//定义结构体变量
	S_S XM = {1232,"小明",12};
	
	Fun(XM);

	return 0;
}

int Fun(S_S XM)
{
	printf("%d--%s--%d\n",XM.number,XM.name,XM.age);

	return 0;
}

⑦ 结构体指针变量

#define MSG_LEN 22
typedef struct xxx
{
	char msg[MSG_LEN];

}SX,*P_SX;

SX等于struct xxx      
P_SX等于 struct xxx *  


int main()
{
	//定义一个结构体指针变量顺便给他一个合法的地址
	//struct xxx *  struct_p = (struct xxx*)malloc(sizeof(struct xxx));
	P_SX struct_p = (P_SX)malloc(sizeof(SX));
	if(struct_p == (void *)0)
	{
		perror("malloc");
		return -1;
	}
	
	strcpy((*struct_p).msg,"收到一条信息!");
	//strcpy(struct_p->msg,"收到一条信息!");
	
	//printf("%s\n",struct_p->msg);
	printf("%s\n",(*struct_p).msg);
	
	return 0;
}		

⑧ 结构体数组

它是一个数组,可以存放多个结构体变量(这个都是要同一种结构体类型!)

typedef struct student
{
	int  number;
	char name[10];
	int  age;
}S_S;


int main()
{
	S_S	student[2] = {
						123,"小明",
						321,"明小",21
					 };
	return 0;
}
	

二、共用体(联合体)

union xxx
{
    int a;
    double b;
    char c;
};
​
大小:
    最宽成员的大小
    
联合体在使用的时候,要一值使用最新的成员变量。

三 枚举 -- 常量集合

enum xxx
{
    a,
    b,
    c
};
​
printf("%d---%d--%d\n",a,b,c);
​
枚举变量大小为4个字节。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值