C语言结构体速成

结构体

同一类问题讨论时需要定义多个同类型变量,可用结构体避免定义多个变量麻烦


结构体的定义:

1.常规定义 2.声明的同时定义

struct time{ struct student{

int........... char........

int.......... char........

}; }Alan,Tom;

struct time t;

*这里的struct time相当于int,char等,是定义类型,而t是定义类型后面的变量

这里的Alan,Tom相当于变量

3.使用结构体作为成员 4.匿名结构体

struct DATE{ struct{

int.......... int............

int.......... char...........

} }Alan,Tom;

struct person{

char........

struct DATE birthday;

};

struct time t;

*struct DATE是定义结构体变量,可以嵌套进结构体


结构体的调用:student.name的.是成员运算符,用来获取结构体中的成员


结构体的初始化:struct student Alan = {xxx,xxx,xxxxxx,xx};


!!!!!意外之喜欸!!!!!

b站的课讲到了一个我一直出错的东西,就是给char string[ ]里加入字符串,之所以不能直接用=是因为,一般来说,二者数组的内存大小不同,所以不能用,但是用strcpy就行了


结构体数组:

struct student{

int.........

char.........

int.........

};

main()

{

struct student class_02[5] = {

{01,"Alan",18};

{02,"Tom",17};

};

}

导出各个学生资料时,用for循环,把结构体名换成class_02[i];


结构体指针:

使用分量运算符 -> 来获取成员 , 而不是 .

struct DATE{

int...........

char........

}date = {2012, 11, 27 }, *d ;

main()

{

d=&date;

printf("%d",d->year)

}


结构体添加成员:

struct time{

int hour;

};

struct time now{1};

struct time past; //定义一个结构体名称

past.hour = now.hour - 1;

此时struct time past为{0}

*自己敲结构体函数

定义: struct time add(struct time now,struct time pass)

{

struct time rel;

rel.hour = .................

return rel;

}

int main()

{

struct time result;

result = add(now,pass);

}

结构体的定义:

只有结构体变量才分配地址,而结构体的定义是不分配空间的

结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间


c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换(struct xxx *)


*用sizeof关键字求结构体长度时,返回的最大基本类型所占字节的整数倍比方说我们上面求得的为44 为 float(4个字节)的整数倍,但是我们把title修改为title[22]; 这时正常长度为46 ,但是你会发现实际求得的为48(4的整数倍)


结构体的存储:

1.结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍

2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐


结构体变量的引用:

如果结构体的成员本身是一个结构体,则需要继续用.运算符,直到最低一级的成员


结构体的初始化:

注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的

进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值

struct student { char* Name; int number; char csex; }stu, * stu; stu = (struct student*)malloc(sizeof(struct student));. / * 结构体指针初始化*/ stu->name = (char * )malloc(sizeof(char)); / * 结构体指针的成员指针同样需要初始化*/


结构体与指针:

(++p) .xxxx指向结构体数组下一个元素的地址

swap函数里,如果不用指针,则只能改变局部变量而不能改变全局变量,因此需要运用指针。


清空结构体:

struct Student { char cName[20]; int number; char csex;

}stu1;

memset(&str,0,sizeof(struct Student)); 如果是数组: struct Student stu[10]; 就是 memset(stu,0,sizeof(struct Student)*10);

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值