在c++
中函数定义一般有五个步骤:1. 返回值类型;2. 函数名;3. 参数表列;4. 函数体语句;5. return表达式。
返回值类型 函数名(参数列表)
{
函数体语句
return 表达式
}
如果函数不需要返回值,声明的时候写void
即可。
函数声明是告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。这样函数就可以写到main
函数后面。
//声明可以多次,定义只能一次
//声明
int max(int a, int b);
int max(int a, int b);
//定义
int max(int a, int b)
{
return a > b ? a : b
}
函数分文件编写一般有4个步骤:
.h
的头文件。.cpp
的源文件。//swap.h文件
#include
using namespace std;
void swap(int a, int b);
//swap.cpp文件
#include "swap.h"
void swap(int a, int b)
{
}
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。与其它变量一样,在使用之前需要对其进行声明。
type *var-name;
如果需要将某个变量的内存地址赋值给var-name
的话,在变量名前加上&
就可以获取到变量的地址,如:p=&a;
。指针前加*
代表解引用,找到指针指向的内存中的数据。
0
的空间。例如:int * p = NULL
。一般用来初始化指针,空指针指向的内存是不可以访问的。int *p = (int *)0x1100
,但是事先并未申请这样一个内存空间,就会报错。 const
修饰指针有三种情况:
int a =10;
int b =10;
int * p = &a
const int * p =10;
//*p = 20; //错误,指针指向的值不可以更改。
p = &b; //正确,指针指向可以改。
int* const p =10;
*p = 20; //正确,指针指向的值可以更改。
//p = &b; //错误,指针指向不可以改。
const int* const p = 10;
*p = 20; //错误,指针指向的值不可以更改。
p = &b; //错误,指针指向不可以改。
利用指针可以访问数组中的元素:
int arr[] = {1,2,3};
int * p = arr; //指向数组的指针, *p是第一个元素,之后p++之后再访问就是后续元素了。
利用指针作为函数参数,可以修改实参的值:
//值传递
void swap1(int a ,int b)
{
int temp = a;
a=b;
b=temp;
}
//地址传递,实参会发生改变
vo1d swap2(int * p1,int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
struct 结构体名{结构体成员列表};
struct student{
string name;
int age;
int score;
}
通过结构体创建变量的方式有三种:
struct 结构体名 变量名
struct student s1; // c++中这里的关键字struct 可以省略
s1.name = "张三";
s1.age = 18;
s1.score = 100;
struct 结构体名 变量名={成员1值, 成员2值...}
struct student s2 ={"李四", 19,100}
定义结构体时顺便创建变量
struct student{
string name;
int age;
int score;
}s3;
s3.name="王五";
s3.age=20;
s3.score=60;
将自定义的结构体放入到数组中方便维护。
语法:struct 结构体名 数组名[元素个数] = {{}, {}, ... {}}
struct student arr[2]={{"张三", 18, 80},{"李四",19,60}}
arr[1].name="王五";// 将李四改为王五
利用操作符->
可以通过结构体指针访问结构体属性。
struct student s ={"李四", 19,100}
struct student *p = &s; // 取值之后返回的是对应的数据类型的指针
p->name; //指针访问结构体属性
结构体可以通过->
操作符来访问结构体中的成员。
结构体嵌套结构体说的是结构体中的成员是另一个结构体。
struct teacher{
int id; //教师编号
string name; //教师姓名
int age; //年龄
struct student stu; //辅导的学生
};
teacher t;
t.stu.name = "张三" //访问结构体中的结构体
将结构体作为参数向函数中传递。传递的方式有两种:1. 值传递;2. 地址传递。
struct student s;
void printstudent(struct student s){....} // 值传递
printstudent(s);
void printstudent2(struct student *p){p->name;....} //地址传递
printstudent(&s);
同样这里地址传递会改变实参值。
结构体中用const
t可以用来防止误操作。比如在结构体值传递到函数中去时,会复制一份结构体传入到函数中去,但是当调用次数多了之后所占的内存空间就也会增大,
struct student s ={"李四", 19,100}
void printstudent2(const struct student *p){p->name;....} //const修饰之后变成只读
printstudent(&s);