我们学了C语言中的函数和结构体。
关于C语言的函数与结构体可以在Xcode中新建File,再选择iOS中的Cocoa Touch Class,新建后缀为'.h'和'.m'
1.函数的声明,与结构体的声明需要在'.h'中声明;也可在主函数文件'main.m'中的主函数前声明。
2.函数一共有四种形式:
(1).无参数无返回值类型函数: 例如, void Hello();
(2).无参数有返回值类型函数: 例如, void printSum(int value1, int value2);
(3).有参数有返回值类型函数: 例如, int getCount();
(4).有参数有返回值类型函数: 例如, int SumValue(int val1, int val2);
// 注意:
(1).无返回值类型函数也可以添加return, 终止函数; 但是有返回值类型的函数必须有return。return后面的数据返回给主调函数(那个函数调用函数,谁就是主调函数, 一般在主函数中)。
(2).参数的写法: 数据类型 + 参数名(形式参数, 称为形参); 多个参数用逗号隔开。每个形参前都需要声明数据类型。
(3).函数声明的模版:
(I)函数声明内形参可以与函数定义的形参不同
int middleValue(int x, int y, int z);
(II)函数声明内形参可以不写
int middleValue(int, int, int);
(III)但是函数声明的形参类型不能省略
int middleValue(int a, int b, int c);
(4).函数的返回值可以像普通变量一样使用。调用的时候传入的数据成为实参,实参可以写常量或常量表达式,也可以写变量。传参过程中, 实参前面不要加类型
例题1: 编写函数,返回三个整数的中间数。
int middleValue(int a, int b, int c)
{
// 先求出三个数的最大值
int max = a > b ? a : b;
max = max > c ? max : c;
// 再求出三个数的最小值
int min = a < b ? a : b;
min = min < c ? min : c;
return a + b + c - max - min;
}
int main(int argc, const char * argv[]) {
int mid = middleValue(1, 9, 4);
printf("middle = %d\n", mid);
return 0;
}
// #import "自己写的文件" 与 import<系统的文件>
4.函数声明与函数实现中函数声明的格式与函数名都要相同。
在主函数里函数外定义的变量为全局变量,在函数内定义为局部变量。
// 在函数体里面不能定义其他函数,能调用函数
//如果函数内有一个局部变量与全局变量名称相同,则调用的时局部变量
5.**结构体是一种自定义的数据类型
// 用struct关键字声明一个结构体
// 注意: struct + 结构体名字为变量类型
// 初始值的顺序与声明结构体内的成员顺序一致
6.结构体重定义的两种方法:
(1)
// 想把struct soilder类型重新定义为Soilder
// 结构体重新定义的第一种方式
typedef struct soilder Soilder;
(2)
// 把size结构体重新定义为MySize
// 结构体重新定义的第二种方式
struct size {
int width;
int height;
}MySize;
7.打印一个结构体变量
// 参数的写法
// 从规范上来讲,不应该省略函数声明
// 函数声明
void printStruct(Soilder s);
// 函数实现
void printStruct(Soilder s)
{
// 函数内可以直接访问形参的成员
printf("%-10s %-10s %-2s\n", s.name, s.rank, s.bloodType);
}
8.结构体访问成员
// 引入一个新的操作符'.'
// 先找到结构体变量Soilder,再通过'.'操作符访问name的成员
9.结构体变量可以直接赋值
// Soilder s5 = s4;
10.例题: 军人的信息
// 定义一个结构体
struct soilder {
char name[20];
// 军衔
char rank[20];
// 血型
char bloodType[3];
};
// 想把struct soilder类型重新定义为Soilder
typedef struct soilder Soilder;
// 函数声明
void printStruct(Soilder s);
// 函数实现
void printStruct(Soilder s)
{
// 函数内可以直接访问形参的成员
printf("%-10s %-10s %-2s\n", s.name, s.rank, s.bloodType);
}
// 主函数
int main(int argc, const char * argv[]) {
Soilder s1 = {"项羽", "元帅", "B"};
Soilder s2 = {"关羽", "上将", "O"};
Soilder s3 = {"张苞", "少校", "A"};
Soilder s4 = {"大嘴", "伙夫", "AB"};
// 结构体数组内存放的都是结构体变量
Soilder array[4] = {s1, s2, s3, s4};
// 先找到结构体变量 array[3]
// 通过结构体变量找到血型的成员 array[3].bloodType
// array[3].name是什么 ----> name字符串的首地址
printf("%s\n", array[3].name);
// 修改name这个字符串--->改成张三
strcpy(array[3].name, "张三");
// array[3].name = "张三"; 错误的 字符串的修改需要用到字符串相关函数
// 调用打印结构体数组的函数
printArray(array, 4);
return 0;
}