C++进阶(二)函数、指针、结构体

文章目录

    • 函数
      • 函数的声明
      • 函数的分文件编写
    • 指针
      • const修饰指针
      • 指针和数组
      • 指针和函数
    • 结构体
      • 定义
      • 结构体数组
      • 结构体指针
      • 结构体嵌套结构体
      • 结构体做函数参数
      • 结构体中const使用

函数

  在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个步骤:

  1. 创建后缀名为.h头文件
  2. 创建后缀名为.cpp源文件
  3. 头文件中写函数的声明。
  4. 源文件中写函数的定义。
//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修饰指针

  const修饰指针有三种情况:

  1. const修饰指针 – 常量指针:特点是:指针的指向可以修改,但是指针指向的值不可以改。
int a =10;
int b =10;
int * p = &a 
const int * p =10; 
//*p = 20; //错误,指针指向的值不可以更改。
p = &b; //正确,指针指向可以改。
  1. const修饰常量 --指针常量:指针指向不可以改,指针指向的值可以改。
int* const p =10; 
*p = 20; //正确,指针指向的值可以更改。
//p = &b; //错误,指针指向不可以改。
  1. const既修饰指针,又修饰常量:指针指向和指针指向的值都不可以改。
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;
}

  通过结构体创建变量的方式有三种:

  1. struct 结构体名 变量名
struct student s1; // c++中这里的关键字struct 可以省略
s1.name = "张三";
s1.age = 18;
s1.score = 100;
  1. struct 结构体名 变量名={成员1值, 成员2值...}
struct student s2 ={"李四"19100}
  1. 定义结构体时顺便创建变量
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 ={"李四"19100}
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使用

  结构体中用constt可以用来防止误操作。比如在结构体值传递到函数中去时,会复制一份结构体传入到函数中去,但是当调用次数多了之后所占的内存空间就也会增大,

struct student s ={"李四"19100}
void printstudent2(const struct student *p){p->name;....} //const修饰之后变成只读
printstudent(&s);

你可能感兴趣的:(cpp进阶)