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之后,一旦有修改操作就会报错,可以防止我们误操作

}

相关推荐
学心理学的程序员1 小时前
anydoc:Firecrawl 出的 Rust 文档转 Markdown,4ms 转换、14 种格式干翻 MarkItDown
开发语言·后端·rust·开源·firecrawl·claude code·anydoc
2501_937860941 小时前
从JDBC到数据访问:Java数据库编程完全指南
java·开发语言·数据库
FfHUCisI1 小时前
Golang SSA 中间表示与优化 Pass
开发语言·后端·golang
JacksonMx1 小时前
Java 服务调用下游接口注意点
java·开发语言
兔兔兔兔11 小时前
记录C++ 11
开发语言·c++
码匠许师傅1 小时前
【C++ 面试真题】32. 聊聊 C++ 的原子变量与无锁编程
java·c++·面试
撩得Android一次心动2 小时前
Kotlin 语言【知识点整理2】
android·开发语言·kotlin
不会就选b2 小时前
Linux之线程池(一)
java·开发语言
wabs6662 小时前
关于栈【力扣150.逆波兰表达式求值的思考】
数据结构·c++·算法·leetcode··代码随想录