C++ 基础知识

冒泡排序

排序总轮数=元素个数-1

每轮对比次数=元素个数-排序论述-1

二维数组

二维数组定义的四种方式:

1.数组类型 数组名 行数 列数

2.数组类型 数组名 行数 列数 ={ {数据1,数据2},{数据3,数据4} };

3.数据类型 数组名行数列数 = {数据1,数据2,数据3,数据4};

4.数据类型 数组名 列数={数据1,数据2,数据3,数据4};

二维数组数组名

1.可以查看二维数组首地址

2.可以计算二维数组所占内存大小

函数

值传递

当函数做值传递时,形参的改变不会影响实参

函数的四种形式

1.无参无返

2.有参无返

3.无参有返

4.有参有返

函数的声明

函数可以声明多次,但是只能定义一次

意义:告诉编译器函数的存在,当函数定义在main函数之后时使用

函数的分文件编写

1.创建后缀名为.h的头文件

2.创建后缀名为.cpp的源文件

3.在头文件中写函数的声明

4.在源文件中写函数的定义

指针

定义指针的语法: 数据类型 *指针变量名;

int * p

让指针记录变量a的地址

int a = 10;

p=&a;

可以通过解引用的方式来找到指针指向的内存

*p =100;

指针在32位系统下占用4字节大小,任何数据类型的指针都是4字节

在64位系统下占用8字节大小,任何数据类型的指针都是8字节

空指针:指针变量指向内存中编号为0的空间

空指针用于给指针变量进行初始化

int *p = NULL;

空指针是不可以进行访问的

0---255之间的内存编号是系统占用的,因此不可访问

野指针:指针变量指向非法的内存空间

如int *p=(int*)0x1100;

const修饰指针

int a=10;

int b=10;

1.const修饰指针:

常量指针 const int* p =&a; 指针指向的值不可以修改,但指针的指向可以修改

即*p=20;错误

p=&b;正确

2.const修饰常量:

指针常量 int* const p2=&a;指针指向的值可以修改,指向不能修改

即*p=20;正确

p=&b;错误

3.const修饰指针和常量

const int * const p3=&a;

指向和指向的值都不可改

即*p=20;错误

p=&b;错误

用指针访问数组

int * p=数组名;

数组名就代表了数组的首地址,不需要加取地址符&

指针和函数

利用指针作函数参数,可以修改实参的值(如果是地址传递,就可以修改实参)

结构体

通过结构体定义变量的方式有三种

  1. struct 结构体名 变量名

  2. struct 结构体名={成员1值,成员2值。。。}

  3. 定义结构体时顺便创建变量

//结构体定义

struct Student

{

string name;//string是字符串类型

int age;

int score;

}stu3;//结构体创建方式3:定义时直接创建

int main(){

Student s1;//创建结构体 c++中 创建结构体时可以不加struct,但定义时要加

//创建变量

s1.name="张三";//通过 . 来访问结构体

s1.age=18;

s1.score=100;

//第二种定义变量方式 s1={"张三",18,100};

//第三种创建方式:定义时直接创建

/*

stu3.name="张三";//通过 . 来访问结构体

stu3.age=18;

stu3.score=100;

*/

}

结构体数组

创建方法 struct 结构体名 数组名元素个数{ };

struct Student s12={

"张三",10,100;

"李四",12,100;

};

结构体指针

1.创建学生结构体变量

student s={"张三",18,100};

2.通过指针指向结构体变量

student * p = &s;//数据类型为结构体名

3.通过指针访问结构体变量中的值

//通过 结构体指针 访问结构体中的属性时,需要用 ' -> '

cout <<"姓名:"<< p->name << "年龄:" <<p->age<< "成绩:""<< p->score <<endl;

结构体可以通过->来访问结构体中的成员

结构体嵌套结构体

struct student{

string name;

int score;

};

struct teacher{

string name;

struct student stu;

};

结构体作函数参数

1.值传递 2.地址传递

void printfStudent1(struct Student s1){

cout<<"姓名:"<<s1.name<<endl;

}

void printfStudent2(struct Student * s1){

cout<<"姓名:"<<s1->name<<endl;

}

int main(){

printfStudent1(s1);//值传递

printfStudent2(&s1);//地址传递

}

如果想修改主函数中的值 就用值传递 ,反之就用地址传递

结构体中const适用场景

将函数中的形参改为指针(使用地址传递),可以减少内存空间(传指针的话接收的也是指针,而指针只占用四个字节(首元素地址),所以即使是很大的数组最终也只占用4字节),而且不会复制出新的副本出来

(做值传递时会生成一个副本)

void printfstudent(const student *s){

//s->age=100;//加入const之后,一旦有修改操作就会报错,可以防止我们误操作

}

相关推荐
wuminyu2 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
言乐64 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
金金计较.4 小时前
Go语言-3
java·开发语言·golang
张小凡vip5 小时前
python--爬虫--经验积累的遇到的坑
开发语言·爬虫·python
Wang's Blog6 小时前
Java框架快速入门: Spring Security+OAuth2之云服务集成与多因子认证设计
java·开发语言·spring
门思科技6 小时前
LoRaWAN 网络容量估算:一个 SX1302 网关到底能带多少设备
开发语言·网络·php
大草原的小灰灰6 小时前
Python基础语法
开发语言·python
无小道7 小时前
C++——列表初始化
c++·列表初始化
blueSatchel7 小时前
c++action 编写(ros-humble)
c++·ros2
泡泡鱼(敲代码中)8 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql