黑马程序员--c语言结构体介绍


结构体(构造类型:数组):
数组:只能由多个相同类型的数据构成
结构体:可以由多个不同的类型的数据

结构体类型 结构体变量名


1.定义结构体类型
struct Person
{// 里面的3个变量可以称为结构体的成员或者属性
int age;
double height;
char *name;
};


2.根据结构体类型,定义结构体变量
struct Person p = {20,1.55, "jack"}; //p为结构体变量

单独赋值:

p.age = 30;

p.name = "rose";


只能在定义结构体/数组的同时赋值
错误写法:
struct Person p2;
p2 = {30, 1.67, "jack"}
正确写法:
struct Person p2 = {20, 1.67, "jim"};
struct Person p2 = {.age = 20, .height = 1.67, .name = "jim"};


内存分析:
1.定义结构体类型;
struct Date
{
int year;
int month;
int day;
};// 仅仅定义类型,并不会分配存储空间


2.定义结构体变量:// 真正分配存储空间
struct Date d1 = {2011, 4, 10};
int s = sizeof(d1);//此结构体类型占用12字节


printf("%p  %p  %p", &d1.year, &d1.month, &d1.day);
//输出地址,之间相差4个字节


d2 = d1; //会将d1所有成员值赋给d2对应值


struct Student stu
{
int age;// 4个字节
char *name;// 8个字节
};//占16个字节 ,必须是最大字节的倍数
//补齐算法(对其算法)


定义结构体变量(3种方式):
1.先定义类型,在定义变量
struct Student stu
{
int age;// 4个字节
char *name;// 8个字节
};


struct Student stu = {20, 1.78, "jack"}

2.定义类型的同时定义变量
struct Person
{//里面的3个变量可以称为结构体的成员或者属性
int age;
double height;
char *name;
} stu; // 定义类型的同时,定义变量

结构体类型不能重复定义


3.定义类型的同时定义变量(省略了类型名称)
struct{
int age;
char *name;
}stu; // 这样定义也是正确的




结构体类型也是有作用域的,从定义类型的哪一行开始,一直到代码块结束
结构体类型的作用域:
定义在函数外面,全局有效(从定义类型的那行开始,一直到文件结尾)
定义在函数(代码块)内部,局部有效(从定义类型的那行开始,一直到代码块结束)


结构体数组:
struct RankRecord
{
int no;
char *name;
int score;
};
//int ages[3] = {1, 2, 3};
struct RankRecord records[3] = 
{
{1, "jack", 5000},
{2, "jim", 500},
{3, "jake", 300}
};
records[0] = {3, "rose", 50};//这样错误

record[0].no = 4;
for (int i=1; i<3; i++)
{
printf("%d\t%s\t%d\n", recorf[i].no, record[i].name,record[i].score);
}




指向结构体的指针:

struct Student
{
int no;
int age;
};


struct Student stu = {1, 20};

struct Student *p;

p = &stu;


//第一种方式
printf("age = %d, no = %d\n", stu.age, stu.no);

//第二种方式
printf("age = %d, no = %d\n", (*p).age, (*p).no);

//第三种方式
printf("age = %d, no = %d\n", p->age, p->no);



指向结构体的指针的定义:
struct Student *p;

利用指针访问结构体的成员:
(*p).成员变量
p->成员变量



结构体的嵌套:
int main()
{
struct Date
{
int year;
int month;
int day;
};

struct Student
{
int no;// 学号

struct Date birthday; // 生日

struct Date ruxueDate; //入学日期

};

struct Studend stu = {1, {2000, 9, 10}, {1992, 5, 18}};

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值