黑马程序员——结构体

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


全局变量和局部变量:

1、 局部变量:在函数(代码块)内部定义的变量;

作用域:从定义那一行开始,一直到代码块结束;

生命周期:从定义的那一行分配存储空间,代码块结束后就会被回收。

没有固定的初始值

2、 全局变量:在函数外定义的变量

  作用域:从定义那一行开始,一直到文件结尾(能被后面的所有函数共享)

  生命周期:程序一启动就分配空间,程序退出才被销毁。

  默认的初始值为0

结构体  构造类型

定义结构体:

<span style="font-size:18px;">struct person
{
int age;
double height;
char *name;
};</span>

根据结构体类型,定义结构体变量:

里面的成为三个成员

struct person p = {20, 1.55, “jack”};  p.age = 30;//更改年龄

struct person p1 = {30, 1.75, “jim”};//只能在定义结构体变量的时候赋值。

以上不能写为struct person p1;p1= {30, 1.75, “jim”};

结构体内存分析:

<span style="font-size:18px;">#include <stdio.h>
int main()
{
// 定义结构体类型,定义类型的时候没有分配存储空间,就行int 一样。
struct date
{
    int year;
    int month;
    int day;
};
//定义结构体变量
struct date d1 = {2009, 4 , 10};
struct date d2 = {2012, 6, 12};
//将d1所有成员的值对应的赋值给d2的所有成员
d2 = d1;
printf("%d-%d-%d\n", d1.year, d1.month, d1.day);
printf("%d-%d-%d\n", d2.year, d2.month, d2.day);  //两个输出的结果都是2009-4-10

return 0;
}</span><span style="font-size:14px;">
</span>

结构体内存细节:

#include <stdio.h>
int main()
{
struct student
{
int age;//4个字节
char *name;//8个字节
};
struct student stu;
stu.age = 20;
stu.name = "jack";
int s = sizeof(stu);
printf("%d\n", s); /*实际输出结果是16 而不是12。因为结构体分配存储空间默认是最大成员字节数的倍数。成为补齐算法(对齐算法)*/

return 0;
}


结构体注意点:

1、定义结构体的第二种方法:

struct student
{
  int age;
  double height;
  char *name;
} stu;         //利用新定义好的类型来定义结构体变量,就像 int a; 一样

2、定义结构体变量的第三种方式,但这种方式不能重用,既不能写struct stu2;

struct {
  int age;
  double height;
  char *name;
} stu;   

结构体类型的作用域:从定义类型的那一行开始到代码块结束。例如一个函数中的结构类型只能用在这个函数中。

要想通用,应该定义全局结构体变量。


结构体数组

例如一个游戏的排行榜。

#include <stdio.h>
int main()
{
   struct rank
{
int num;  // 序号
char *name; // 名称
int score; // 积分
};
struct rank records[3] =         /*要想改写里面的值不能用records[0] = {4, “hanmei”, 100};
                                  可写为records[0].num = 4;  */
{
   {1, "jack", 500},
   {2, "rose", 300},
   {3, "jim", 200}
};
for(int i = 0; i<3; i++)
{
printf("%d\t%s\t%d\n", records[i].num, records[i].name, records[i].score );
}
return 0;
}


指向结构体的指针:

#include <stdio.h>
int main()
{
   struct student
{
int num;  
int age;
};
struct student stu = {1, 25};
// 指针变量p指向struct student类型的数据
struct student *p;
p = &stu;
// 第一种输出方法
ptintf("num = %d, age = %d\n", stu.num, stu.age );
// 第二种方法
ptintf("num = %d, age = %d\n", (*p).num, (*p).age );
// 第三种方法
ptintf("num = %d, age = %d\n", p->num,  p->age );  // 也可以用p->num来修改值

return 0;
}

结构体的嵌套

<span style="font-size:18px;">#include <stdio.h>
int main()
{
   struct date
{
int year;
int month;
int day;
};
struct student
{
int num;  //学号
struct date birthday;//生日
struct date ruxuedate;//入学日期
};
struct student stu = {1, {2009, 8, 25},{2012, 6, 1}};
printf("%d\n", stu.birthday.year);//调用输出出生的年
return 0;   </span>
<span style="font-size:18px;">}</span>









 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值