------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>