函数
相当于功能模块,通过调用函数,能直接实现函数的功能
函数定义: 返回值类型 函数名(参数){
函数体
}
作用: 避免写大量的重复代码
能够使代码更加精简
四种形式:
无参无返回值
void name ();
无参有返回值
int name ();
有参无返回值
int name (int a,int b);
有参有返回值
返回值类型: 无返回值类型,写成 void
C语言中不能返回数组
如果有返回值,必须使用return返回
函数名: 命名规范和变量名一样,与返回值类型用空格隔开
参数: 放在与函数名紧挨着的括号内,括号内可以有多个参数,每个参数都要指定数据类型,不管数据类型是否相同
return: 返回指定的数据类型,由函数的返回值类型决定什么类型的数据
碰到return,函数执行结束,return后面的代码不再执行
// 不能在函数里面调用函数
函数调用: 当函数定义在调用处的下面时,需要函数声明(函数声明:将函数的大括号变成分号,放在调用处所在函数的上面 void printfHelloWorld();)
函数定义在调用处所在函数的上面时,不需要函数声明
* 1. 建文件 点击你想放的位置->Command+N->OS X->Source->C file
* 2. 在.h 里面声明一个函数, .c 实现这个函数
* 3. 该文件内导入该文件的头文件,也就是.h文件
* 4. 直接调用函数就行
函数的嵌套调用
/*
* s = (2*2)! + (3*3)! +(4*4)!
* 1、整型数的平方
* 2、一个整型数的阶乘
* 3、三个整形的平方的阶乘的和
*/
#includeint method2(int a)
{
int sum = 1; // 用sum获取到a的阶乘
for (int i = 1; i<=a; i++)
{
sum *= i;
}
return sum;
}
int method1(int n){
int sum = 0; //sum接受最终的结果
for (int i = 2; i<=n; i++)
{
// sum +=i*i; (用一个函数计算阶乘)
sum += method2(i*i); //通过method2获取到i值平方的阶乘,再通过sum累加i值平方的阶乘
}
return sum;
}
int main(){
int sum = method1(4);
printf("%d\n",sum);
}
递归函数
/*
本质:自己调用自己
5! (jiecheng(5))
5*4! (5*jiecheng(4))
4*3! (4*jiecheng(3))
3*2! (3*jiecheng(2))
2*1! (2*jiecheng(1))
#includeint jiecheng (int n){
if (n == 1)
{
return 1;
}
return n*jiecheng(n-1);
}
int main (){
printf("n的阶乘=%d\n",jiecheng(5));
}
结构体概念
结构体:也相当于一个容器,与数组的本质区别在于,数组只能存放一种数据类型,而结构体能够存放多种数据类型
结构体能够直接复制,可以通过结构体的这种特性,让数组直接赋值
利用结构体可以创造多种数据类型
结构体的声明
格式:struct 结构体名
{
属性类型 属性名1;
属性类型 属性名2;
...
属性类型 属性名n;
};
定义结构体变量
结构体名字 结构体变量 = 初值;
修改结构体变量的内容,通过给结构体变量.相应的属性来赋值或者取值
定义过的结构体变量,不能再通过大括号来赋值
结构体的优化
typedef 能够给数据类型重命名
格式:typedef type name
type:原数据类型的名字
name:重新给原数据类型设置的名字
结构体嵌套
typedef struct Brithday{ //创建一个学生体并重命名
int year;
int month;
int day;
}Brithday;
typedef struct Student{ //创建一个学生体并重命名
char name[20];
Brithday brithday; //结构体的嵌套,也可以不嵌套,用结构体Brithday的内容替换
}Student;
int main (){
Student pangrenmeng = {"pang",{1993,03,16}};
int month = pangrenmeng.brithday.month;
指针概念
1.计算机在内存中存放数据,首先需要为数据找到一块地址
2.每块地址都有一个编号,通过编号找到这块地址
3.地址的编号其实就是指针
4.指针指向的就是计算机磁盘内的一块地址
5.指针变量:就是用来存储地址的
格式:
数据类型 *变量名 = 赋初值;
'*'就是一个标志符:用来表明这个变量是指针变量
数据类型:用来指示变量所指向的地址,存放什么样的数据
赋初值:因为定义的是指针变量,所以赋初值时要给一个地址
'&'取地址符
格式:
&变量名
在变量名前加一个&,就代表取到了该变量所在的地址
取值运算符
取值格式:
*指针变量
在变量的前面一个*代表取出来改地址的值
使用指针来交换两个变量的值
int i = 3;
int e = 7;
int * r = &i;
int * t = &e;
int temp = 0;
temp = *r;
*r = *t;
*t = temp;
printf("i = %d\ne = %d\n",*r,*t);
int y = 7;
int x = 9;
int * s= &y;
int * z= &x;
int temp1 = 0;
temp1 = *s;
*s = *z;
*z = temp1;
printf("y = %d\nx = %d\n",*s,*z);
指针与数组
数组: 定义一个数组,系统会分配一块连续的内存空间,数组名就是该数组里面第一个元素的地址
数组名就是一块地址
char *strings[3] = {"iPhone" , "Android" ,"win8"};
printf("%c\n%s\n%s\n",*(strings[1]+1),*(strings+1),*(strings+2));
指针与字符
char string[] = "awfr2";
char test = *(string+1);
*string = test;
*(string+1) = 'q';
*(string+4) = 'q';
printf("%s\n",string);
结构体指针
// 定义一个英雄结构体
typedef struct Hero
{
char name[10];
int blood;
char sex;
}Hero;
int main() {
Hero gailun = {"gailun",350,'m'}; //定义一个Hero类型的指针
Hero *p = &gailun; //读取Hero类型指针里面的数据
printf("%s的一级血量是%d\n",(*p).name,(*p).blood);
Hero datou ={"datou",300,'m'};
Hero *p1 = &datou;
printf("%s的一级血量是%d\n",(*p1).name,(*p1).blood);
结构体数组
int main(){
Hero gailun = {"gailun",350,'m'};
Hero aixi = {"aixi",300,'w'};
Hero ruizi = {"ruizi",500,'m'};
// 定义一个结构体数组
// 数组名代表的是数组的第一个元素的地址
Hero list[] = {gailun,aixi,ruizi};
//定义一个结构体指针,用来存放地址
Hero *hero = list;
printf("%s的血量%d\n",(*hero).name,(*hero).blood);
printf("%s的血量%d\n",(*(hero+1)).name,(*(hero+1)).blood);
printf("%s的血量%d\n",(*(hero+2)).name,(*(hero+2)).blood);
指针的指针
int main(){
//定义变量a 系统给地址
int a = 6;
//定义一个指针变量,系统还会给地址
int *p = &a;
//定义一个指针变量,来存储变量p的地址
int **pp = &p;
//通过双星找到指针的指针里面的值
printf("a=%d\n",**pp);