指针函数:
返回值是指针的函数
指针函数的定义:
一般形式:
类型说明符 *函数名(形参表){
函数体
}
其中, 函数名之前加了’*’ 号表明这是一’指针型函数, 即返回值是一个指针. 类型说明符表示了返回的指针所指向的数据类型
函数指针:
- 一个函数在内存中总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址——把函数的这个首地址(入口地址) 赋予一个指针变量, 使该指针变量指向该函数. 然后通过指针变量就可以找到并调用这个函数——这种指向函数的指针变量称为”函数指针变量”
类型说明符 (*指针变量名)(函数的参数);
类型说明符: 是指向的函数的返回值类型
函数的参数: 是指向的函数的参数
以上两个如果都没有(void 和 无参)的话, 指针声明的时候也可以改变
就是相当于把函数头中的函数名改成了(*p)
声明
1 int sum(int a, int b); 2 int (*p)(int a, int b);
初始化:
p1 = sum; // 存的就是函数在内存中的首地址
函数指针变量注意:
- 函数指针变量不能进行算术运算, 这是与数组指针变量不同的. 数组指针变量加减一个整数可以使指针移动指向后面或者前面的数组元素, 而函数指针的移动式毫无意义的(函数体内的地址移动基本上是没有意义的)
- 函数调用中”(*指针变量名)”的两边的括号不可少, 其中的*不是求值匀速, 跟指针变量声明时一样, 它也只是一种表示符号, 表明该变量是一种指针变量
构造类型开头:
- 什么是构造数据类型: 构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的——也就是说:一个构造类型的值可以分解成若干个”成员” 或 “元素”. 每个成员都是一个基本数据类型或又是一个构造类型
2.典型的几种构造类型:
数组 array
结构体 struct
共用体(联合体) union
3.结构体:
数组的缺陷: 只能存储同一种数据类型的数据
结构体: 相当于其他高级语言中的 记录
是一种构造类型, 由若干个”成员”组成, 每一个成员可以使一个基本数据类型或者又是一个构造类型
4.用结构体的目的:
- 可以忽视数据类型而把功能相同的数据组织起来存在一起, 能够使得在使用时更加方便
- 在调用函数的时候, 如果传递参数比较多, 传一个结构体相对而言简单一些, 很多系统自带的函数必须用到结构体
- 作用: 可以创建一种新的数据类型, 指定这个新的数据类型的变量是由哪些小便量联合而成的.
5.结构体的声明
1 struct 结构名{ 2 //成员列表 3 }; 4 5 //定义一个学生的结构体 6 struct stu{ 7 int num; 8 char name[20]; 9 char sex; 10 float score; 11 };
声明时候的注意事项: 结构体花括号后面有一个分号, 不能省略
6. 注意
- 结构体定义完成以后, 计算机并不会给结构体分配内存空间, 而是在定义结构体变量之后分配内存空间
- 结构体是定义的一种新的数据类型, 所以在使用结构体变量之前, 需要先定义类型, 然后再声明变量
- 命名规范: 每一个单词的首字母大写
7. 定义一个结构体类型的变量
- 定义了结构体以后再定义结构体变量
struct stu stu1;
//这句话表示定义一个stu1结构体类型的变量
//stu1是因为是stu类型, 所以stu1可以存放学生的学号, 姓名, 年龄, 成绩;
//也可以同时定义多个结构体变量
struct stu stu2, stu3, stu4;
- 定义结构体的同时定义结构体变量
1 struct Car{ 2 int num; 3 char name; 4 }car1, car2, car3;
- 用匿名的结构体来定义结构体变量
1 struct{ 2 int num; 3 char color; 4 }car1, car2, car3;
这种方法尽量不要用
- 默认值的问题:
- 只声明不初始化: 全部是垃圾值
- 部分 / 全部初始化: 未初始化的值自动赋0
- 作用域问题:
- 一般情况下, 跟正常变量一样, 出了其所定义的代码块便失效
- 而一个结构体一般是要多出引用, 所以一般情况下是全局的
8.结构体数组
- 声明: struct 元素类型 数组名[数组长度]
struct Student students[5];
表示了我们声明了一个长度为5的数组, 数组的名字: students, 数组的长度: 5, 数组元素的类型: struct Student, 所以, 这个数组能够存储 5 个 struct Student 类型的元素
- 初始化
- 声明以后元素单独初始化
- 声明同时完全初始化 / 部分初始化
9. 结构体指针
- 格式: struct 结构体类型名称 *指针名 → struct Student *pStu
声明了一个struct Student指针变量, 这个指针变量的类型是struct Student, 这个指针就只能指向struct Student 类型的变量
- 初始化步骤:
- 取出结构体变量的地址
- &
- 将地址值赋给指针变量
- struct Student xiaoMing = {“小明”, 86};
- struct Student *pStu = &xiaoMing;
- 取出结构体变量的地址
- 结构体指针访问结构体变量: 见LH20160309/struct array结构体数组
10.结构体嵌套
- 简单, 略
11.结构体与函数
- 结构体作为参数传值, 是值传递
- 如果希望函数的内部可以实参结构体变量的值, 那么结构体指针作为参数
- 作为返回值:
1 struct Student getAStudent(){ 2 struct Student s1 = {“xiaoMing”, 81}; 3 return s1; 4 } 5 // 不能返回s1的地址, 因为作为局部变量, 函数调用完其地址就释放了 6 7 // 如果要想保持其地址不变, 类比与字符串指针, calloc在堆区申请空间就可以了, 记得free.