一、定义指针变量指向sum函数
左边的int:指针变量p指向的函数返回int类型的数据
右边的(int, int):指针变量p指向的函数有2个int类型的形参
void sum(int a, int b) { } int (*p)(int, int); p= sum;
(*p)是固定写法,代表指针变量p将来肯定是指向函数
左边的void:指针变量p指向的函数没有返回值
右边的():指针变量p指向的函数没有形参
类比OC中block的定义void (^myBlock) (参数) = ^{}
二、根据变量的作用域,可以分为:
1.局部变量:
1> 定义:在函数(代码块)内部定义的变量(包括函数的形参)
2> 作用域:从定义变量的那一行开始,一直到代码块结束
3> 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
4> 没有固定的初始值
2.全局变量
1> 定义:在函数外面定义的变量
2> 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
3> 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
4> 默认的初始值就是0
三、数组:只能由多个相同类型的数据构成
结构体:可以由多个不同类型的数据构成
#include <stdio.h> int main() { //int ages[3] = {[2] = 10, 11, 27}; //int ages[3] = {10, 11, 29}; // 1.定义结构体类型 struct Person { // 里面的3个变量,可以称为是结构体的成员或者属性 int age; // 年龄 double height; // 身高 char *name; // 姓名 }; // 2.根据结构体类型,定义结构体变量 struct Person p = {20, 1.55, "jack"}; p.age = 30; p.name = "rose"; printf("age=%d, name=%s, height=%f\n", p.age, p.name, p.height); /* 错误写法 struct Person p2; p2 = {30, 1.67, "jake"}; */ struct Person p2 = {.height = 1.78, .name="jim", .age=30}; //p2.age = 25; return 0; }
四、补齐算法:结构体所占用的存储空间 必须是 最大成员字节数的倍数
void test1() { struct Student { int age;// 4个字节 char a; //char *name; // 8个字节 }; struct Student stu; //stu.age = 20; //stu.name = "jack"; // 补齐算法(对齐算法) int s = sizeof(stu); //s == 16
五、结构体注意点
1.定义结构体变量的3种方式
1> 先定义类型,再定义变量(分开定义)
struct Student { int age; }; struct Student stu;
2> 定义类型的同时定义变量
struct Student { int age; } stu; struct Student stu2;
3> 定义类型的同时定义变量(省略了类型名称)
struct { int age; } stu;
2.结构体类型的作用域
1> 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
2> 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)
六、结构体数组
struct RankRecord { int no; // 序号 4 int score; // 积分 4 char *name; // 名称 8 }; // 对齐算法 // 能存放3个结构体变量,每个结构体变量占16个字节 /* int no; // 序号 4 char *name; // 名称 8 int score; // 积分 4 */ struct RankRecord records[3] = { {1, "jack", 5000}, {2, "jim", 500}, {3, "jake",300} }; records[0].no = 4; // 错误写法 //records[0] = {4, "rose", 9000};
七、1.指向结构体的指针的定义
struct Student { int age; }; struct Student *p;
2.利用指针访问结构体的成员
1> (*p).成员名称
2> p->成员名称
八、结构体和函数
1.如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员,修改函数内部结构体的成员不会影响外面的实参结构体
2.如果将结构体指针作为函数参数,是将结构体的地址传给了形参,修改函数内部结构体的成员会影响外面的实参结构体