1.定义指向函数的指针
void haha(double num1, char *s1, int num2)
{
}
void(*p)(double, char *, int);
p = haha; // 或者double (*p)(double, char *, int) = haha;
如何间接调用函数利用指向函数的指针调用
1> p(10.7, "jack", 10);2> (*p)(10.7, "jack", 10);
2.局部变量和全局变量(根据根据变量的作用域划分)
2.1.局部变量:
1> 定义:在函数(代码块)内部定义的变量(包括函数的形参)
2> 作用域:从定义变量的那一行开始,一直到代码块结束
3> 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
4> 没有固定的初始值
2. 2.全局变量 :
1> 定义:在函数外面定义的变量
2> 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
3> 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
4> 默认的初始值就是0
3.结构体
1> 可以由不同类型的数据组成
2> 先定义类型,再利用类型定义变量
与数组的区别:
数组
1> 只能由同一种类型的数据组成
2> 定义:数据类型 数组名[元素个数];
定义一个结构体类型:
struct Person
{ // 里面的3个变量,可以称为是结构体的成员或者属性 i
nt age; // 年龄
double height; // 身高
char *name; // 姓名
};
//根据结构体类型,定义结构体变量
struct Person p = {20, 1.58, "david"};
以下定义结构体变量写法错误:
错误1. 不能定义完变量名之后再全部初始化赋值,应该定义完成同时赋值。
/
*错误写法
struct Person p2;
p2 = {30, 1.67, "david"};
*/
/*正确写法
p.age = 30;
p.name = "david";
p.height = 1.67;
*/
注意:结构体类型不能重复定义例如
struct Student
{ int age;
};
struct Student
{
double height;
};
struct Student stu;
虽然内部属性不一样,但是C语言不允许在一个作用域有重名的结构体类型,编译器还是会报重复定义的错
定义结构体数组:
struct RankRecord
{
int no; // 序号
int score; // 积分
char *name; // 名称
};
struct RankRecord records[3] =
{
{1, "jack", 5000},
{2, "jim", 500},
{3, "jake",300}
};
4.指向结构体的指针
struct Student
{
int no; int age;
};
// 结构体变量
struct Student stu = {1, 20};
// 指针变量p将来指向struct Student类型的数据
struct Student *p;
// 指针变量p指向了stu变量
p = &stu;
访问结构体变量成员的三种方式:
// 1:stu.age, stu.no
// 2: (*p).age, (*p).no
// 3: p->age, p->no