一、函数
什么是函数
在C中函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收。接收用户数据的函数在定义时要指明参数,不接收用户数据的不需要指明,根据这一点可以将函数分为有参函数和无参函数。
自从有了函数就有了程序复用,大大简化开发人员的工作力度。
函数分类:
1 首先是自定义函数
所谓自定义就是用户自己定义的函数,实现自己想要功能的函数并且全部代码有自己编写
自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设
计。这给程序员一个很大的发挥空间。
函数的组成:
ret_type fun_name(para1, * )
{
statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1 函数参数
自定义函数举例:
求两个数的和:
2 库函数int Add(int a, int b) {
int c = a + b;
return c;
}
库函数不是有开发人员自己编写,由编译器提供的函数就是库函数。
在C语言基础库提供了大量的库函数来方便开发人源的开发效率。
C语言常见的库函数由以下几种:
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数
常见的库函数可以在这里查找
函数的参数:
实参:
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形参:
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
#include<stdio.h> int Add(int a, int b) { int c = a + b; return c; } int main() { printf("%d", Add(2, 5)); return 0; }
代码中a,b为形参,2,5为实参。
这里可以看到Add函数在调用的时候,a,c拥有自己的空间,同时拥有了和实参一模一样的内容。所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。
函数调用
传值调用:
前边的Add()函数调用函数就是一个传值调用ab值得改变不影响实参的改变。
地址调用:
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起正真的联系,也就是函数内部可以直接操
作函数外部的变量。
就是形参和实参共用同一个内存,内存中数据的改便会引起实参的改变。
二、结构体
C语言除了常用数据类型还有自定义数据类型那就是结构体
结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员,其描述了一块内存区间的大小及解释意义
结构体的定义与声明
struct tag { member-list } variable-list ;
例如描述一个学生:
struct student{ string name; int age; string sex; string id; }
在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c //同时又声明了结构体变量s1 //这个结构体并没有标明其标签 struct { int a; char b; double c; } s1; //同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c //结构体的标签被命名为SIMPLE,没有声明变量 struct SIMPLE{ int a; char b; double c; }; //用SIMPLE标签的结构体,另外声明了变量t1、t2、t3 struct SIMPLE t1, t2[20], *t3; //也可以用typedef创建新类型 typedef struct{ int a; char b; double c; } Simple2; //可以用Simple2作为类型声明新的结构体变量 Simple2 u1, u2[20], *u3;
结构体的变量的定义与初始化
struct Point { int x; int y; }p1; //声明类型的同时定义变量p1 struct Point p2; //定义结构体变量p2 //初始化:定义变量的同时赋初值。 struct Point p3 = {x, y}; struct Stu //类型声明 { char name[15];//名字 int age; //年龄 }; struct Stu s = {"zhangsan", 20};//初始化 struct Node { int data; struct Point p; struct Node* next; }n1 = {10, {4,5}, NULL}; //结构体嵌套初始化 struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
结构体中元素的访问
对于student结构体
struct student{ string name; int age; }
在内存空间开辟一块空间
里边存放 name age两个数据
结构体中元素的访问是依靠(.)来访问首先定义结构体变量由结构体变量来访问结构体中的元素
struct student s; s.name; s.age;
结构体指针访问指向变量的成员 有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
struct Stu { char name[20]; int age; }; void print(struct Stu* ps) { printf("name = %s age = %d\n", (*ps).name, (*ps).age); //使用结构体指针访问指向对象的成员 printf("name = %s age = %d\n", ps->name, ps->age); } int main() { struct Stu s = {"zhangsan", 20}; print(&s);//结构体地址传参 return 0; }