【黑马程序员】c++基础知识

文章目录

  • C++初识
    • 编写hello world
    • 注释
    • 变量
    • 常量
      • 定义常量的两种方式
    • 关键字
    • 标识符命名规则
  • 数据类型
    • 整形
    • sizeof关键字
    • 实型(浮点型)
    • 字符型
    • 转义字符
    • 字符串型
    • 布尔类型
    • 数据的输入
  • 运算符
  • 程序流程结构
    • 顺序结构
    • 选择结构
      • 三种形式
      • 三目运算符
      • switch语句
    • 循环结构
      • while循环语句
      • do...while循环语句
      • for循环语句
    • 跳转语句
      • break语句
      • continue语句
      • goto语句
  • 数组
    • 一维数组
      • 一维数组定义方式
    • 二维数组定义方式
      • 数组名的用途
  • 函数
    • 定义
    • 函数的声明
    • 函数的分文件编写
  • 指针
    • 空指针和野指针
      • 空指针
      • 野指针
    • const修饰指针
  • 结构体
    • 结构体定义使用
    • 结构体数组
    • 结构体指针
    • 结构体嵌套结构体
    • 结构体做函数参数

C++初识

编写hello world

# include <iostream>using namespace std;int main() {cout << "hello world" << endl;return 0;
}

注释

  • 单行注释://注释内容
  • 多行注释:/*注释内容*/

变量

  • 作用:给一段指定的内存空间取名,方便操作这段内存

  • 语法:类型 变量名 = 初始值;

常量

  • 用于记录程序中不可更改的数据

定义常量的两种方式

  • #define宏常量#define 常量名 常量值,通常在文件上方定义,表示一个常量

  • const修饰的常量:const 数据类型 常量名 = 常量值,通常在变量定义之前加const,修饰该变量为常量,不可更改

关键字

  • 关键字是C++预先保留的字符,在定义变量或者常量时不要使用

标识符命名规则

  • 标识符不能是关键字

  • 只能由字母、数字、下划线组成

  • 第一个字符必须是字母或者下划线

  • 标识符中字母区分大小写

数据类型

  • C++规定在创建一个变量或者常量的时,必须要指定出相应的数据类型,否则无法给变量分配内存
  • 存在意义:给变量分配合适的内存空间

整形

  • 作用:整形表示的是整数的数据类型

  • c++能够表示整形的类型有以下几种方式,区别在于所占内存空间的不同

数据类型占用空间取值范围
short(短整型)2字节-215~215-1
int(整形)4字节-231~231-1
long(长整形)windows为4字节,Linux32位为4字节,64位为8字节-231~231-1
long long(长长整型)8字节-263~263-1

sizeof关键字

  • sizeof关键字可以统计数据类型所占内存大小
  • 语法:sizeof(数据类型/变量 )
  • 演示
#include <iostream>using namespace std;int main() {short a = 10;cout << "short 类型所占内存空间为" << sizeof(a) << endl;cout << "int 类型所占内存空间为" << sizeof(int) << endl;cout << "long 类型所占内存空间为" << sizeof(long) << endl;cout << "long long 类型所占内存空间为" << sizeof(long long) << endl;return 0;
}

实型(浮点型)

  • 小数默认的是double类型,可以在float类型的小数值后面直接加一个f,减少一次double到float的强制类型转换float f = 3.14f;
数据类型占用空间有效数字范围
float4字节7位有效数字
double8字节15~16位有效数字
  • 科学计数法表示小数
#include <iostream>using namespace std;int main() {float f1 = 3.14f;cout << "folat 值" << f1 << " float 占用空间大小" << sizeof(f1) << endl;double d1 = 3.1415926;cout << "double 值" << d1 << " double 占用空间大小" << sizeof(d1) << endl;// 科学计数法float e1 = 3.14e4;    // 3.14 * 10^4float e2 = 3.14e-4;    // 3.14 * 0.1^4cout << "科学计数法e1值" << e1 << endl;cout << "科学计数法e2值" << e2 << endl;return 0;
}

字符型

  • 字符型变量用于显示单个字符,单个字符使用单引号包裹

  • 语法:char 变量名 = '变量值';

  • c和c++中变量只占1个字节

  • 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

转义字符

  • 作用:用于表示一些不能显示出来的ASCII字符

字符串型

  • 作用:用于表示一串字符,字符串使用双引号包裹

  • 两种风格

    • c风格字符串:char str[] = "hello";

    • c++风格字符串:string 变量名 = 字符串值;,需要包含头文件#include <string>

#include <iostream>
#include <string>using namespace std;int main() {char str[] = "hello";cout << str << endl;string str1 = "world";cout << str1 << endl;return 0;
}

布尔类型

  • 布尔类型代表真或者假的值

  • 布尔类型只有两个值:true或者false

  • 布尔类型占1个字节大小

数据的输入

  • 作用:用于从键盘获取数据

  • 关键词:cin

  • 语法:cin >> 变量

# include <iostream>using namespace std;int main() {int a;cin >> a;cout << "收到的输入a的值是:" << a << endl;return 0;
} 

运算符

  • 作用:用于执行代码的计算

  • 分类

运算符类型作用
算术运算符处理四则运算
赋值运算符将表达式的值赋值给变量
比较运算符用于表达式的比较,并返回一个真值或假值
逻辑运算符用于根据表达式的值返回真值或假值

程序流程结构

顺序结构

  • 程序按顺序执行,不发生跳转

选择结构

  • 根据是否满足条件,有选择的执行相应的功能

三种形式

  • 单分支if

  • 多行格式if...else..

  • 多条件if...elseif...else

三目运算符

  • 语法:表达式1?表达式2:表达式3,如果表达式1为真执行表达式2,否则执行表达式3

switch语句

  • 作用:执行多条件分支语句

  • 语法

switch(表达式){case 结果1: 执行语句;break;case 结果1: 执行语句;break;... ...default: 执行语句;break;
}

循环结构

  • 根据是否满足条件,循环多次的执行某段代码

while循环语句

  • 语法:while(循环条件){循环语句},只要条件为真,就执行循环语句

do…while循环语句

  • 语法:do {循环语句} while(循环条件)
  • 与while循环的区别是先执行一次循环语句,在判断条件是否成立

for循环语句

  • 语法:for(初始表达式;条件表达式;变量变化表达式){循环语句}

跳转语句

break语句

  • 作用:用于跳出选择结构或者循环结构

  • 使用时机

    • 出现在switch条件语句中,作用是终止case并跳出switch

    • 出现在循环语句中,作用是跳出当前循环语句

    • 出现在嵌套循环中,作用是跳出离它最近的一层训话

continue语句

  • 作用:在循环语句中,跳过本次循环中余下尚未执行的代码,继续执行下一次循环

goto语句

  • 语法:goto 标记;

  • 如果标记名称存在,执行到goto语句时,会跳转到标记的位置

#include <iostream>
using namespace std;
int main(){cout << 1<< endl;goto LABEL;cout << 2<< endl;cout << 3<< endl;LABEL:return 0;
}

数组

  • 数组就是一个集合,里面存放着相同类型的数据元素

  • 数组名的命名规范和变量名命名规范一致

  • 特点:

    • 数组中每个元素都是相同的数据类型

    • 数组是由连续的内存位置组成的

    • 数组元素下标是从0开始的

一维数组

一维数组定义方式

    // 数据类型 数组名[数组长度];int arr1[10];// 数据类型 数组名[数组长度] = {值列表}int arr2[3] = {1, 2, 3} ;// 数据类型 数组名[] = {值列表}int arr3[] = {3, 4};

二维数组定义方式

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

数组名的用途

  • 可以统计整个数组在内存中的长度:sizeof(数组名)
  • 可以获取数组在内存中的首地址

函数

定义

返回值类型 函数名 (参数列表)
{函数体;return 返回值;
}

函数的声明

  • 作用:告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义

  • 函数的声明可以有多次,单函数的定义只能有一次

函数的分文件编写

  1. 创建后缀为.h的头文件
  2. 创建后缀为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义

指针

  • 不管是什么数据类型,32位操作系统下指针占4字节,64位操作系统下指针占8字节

空指针和野指针

空指针

  • 指针变量只想内存中编号为0的空间

  • 用途:初始化指针变量int * p = NULL;

  • 注意:空指针指向的内存是不可以访问的,0~255之间的内存编号是系统占用的,因此不可以访问

野指针

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

const修饰指针

  • 常量指针:const修饰指针,指针的指向可以修改,但是指针指向的值不可以修改
int a = 10;
const int * p = &a; 
  • 指针常量:const修饰常量,指针的指向不可以修改,但是指针指向的值可以修改
int a = 10;
int * const p = &a; 
  • const即修饰指针又修饰常量,既不可以修改指针的指向,也不可以修改指针指向的值
int a = 10;
const int * const p = &a; 

结构体

结构体定义使用

  • 结构体类型属于用户自定义类型,允许用户存储不同的数据类型

  • 语法:

struct 结构体名 {// 成员变量
}
  • 通过结构体创建变量
    struct Student stu1;// 创建结构体变量时struct关键字可以省略Student stu2 = {name:"zs", age:18};struct Student stu3 = {"lisi", 20};// 结构体变量利用"."访问成员cout << stu1.name << " " << stu1.age << endl;

结构体数组

    // 创建结构体数组Student stus[2] = {{name:"zhangsan", age:10},{name:"wangwu", age:78}};// 给结构体中的元素赋值cout << "修改前的值:" + stus[1].name << endl;stus[1].name = "zsx";cout << "修改后的值:" + stus[1].name << endl;// 遍历结构体数组for (int i = 0; i < sizeof(stus) / sizeof(Student); i++) {cout << "姓名:" << stus[i].name << "   年龄: " << stus[i].age << endl;}

结构体指针

  • 通过指针访问结构体中的成员

  • 使用->运算符可以通过结构体指针访问结构体中的属性

    Student *pstu = &stu2;cout << "修改前-》姓名:" << pstu->name << "   年龄: " << pstu->age << endl;pstu->name = "aaa";cout << "修改后-》姓名:" << pstu->name << "   年龄: " << pstu->age << endl;

结构体嵌套结构体

// 定义结构体
struct Student {string name;int age;
};struct Teacher {string name;int age;Student stu;
};// 结构体嵌套
Teacher tea = {name: "canglaoshi",age: 40,stu:{name: "xiaocang",age: 18,},
};
cout << "老师信息:名字->" << tea.name << "  年龄-> " << tea.age << "  老师的学生信息: 学生名字-> " << tea.stu.name<< "  学生年龄-> " << tea.stu.age << endl;

结构体做函数参数

  • 值传递不会修改主函数中的值
  • 指针传递会修改函数中的值,使用指针可以避免在结构体特别大时,值传递浪费大量空间
// 值传递
void printStudentInfo1(Student stu) {cout << "姓名:" << stu.name << "年龄:" << stu.age << endl;
}// 指针传递
void printStudentInfo2(Student *stu) {cout << "姓名:" << stu->name << "年龄:" << stu->age << endl;
}
// const指针传递
void printStudentInfo2(const Student *stu) {// stu.name = "zhangsan"   因为是const所以不能进行该操作cout << "姓名:" << stu->name << "年龄:" << stu->age << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/730230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度智能云发布专用向量数据库 VDB 1.0,全新设计内核开启性能狂飙

1 专用向量数据库应对未来业务挑战 向量数据库 向量检索 数据库 向量数据库大致可以分为 2 部分&#xff1a;向量数据的检索&#xff0c;以及向量数据的存储和管理。 向量数据库的性能&#xff0c;比如高 QPS、低延时等&#xff0c;使得业务能够更快的响应用户的查询请求…

371. 牧师约翰最忙碌的一天(tarjan,2-SAT)

371. 牧师约翰最忙碌的一天 - AcWing题库 牧师约翰在 9 月 1 日这天非常的忙碌。 有 N 对情侣在这天准备结婚&#xff0c;每对情侣都预先计划好了婚礼举办的时间&#xff0c;其中第 i 对情侣的婚礼从时刻 Si 开始&#xff0c;到时刻 Ti 结束。 婚礼有一个必须的仪式&#xf…

2024 AI 辅助研发的新纪年

随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI正逐渐渗透到研发的各个环节&#xff0c;变革着传统的研发模式。在这一背景下&#xff0c;AI辅助研发不仅…

【Python】约瑟夫环问题

任务描述 据说著名历史学家 Josephus有过以下的故事&#xff1a;Josephus及他的朋友共41人围成一个圆圈&#xff0c;由第1个人开始报数&#xff0c;每数到3该人就必须出去&#xff0c;然后再由下一个人重新报数&#xff0c;直到圆圈上少于3人为止。Josephus 将朋友与自己安排在…

【kubernetes】关于k8s集群中的ingress规则案例

目录 一、k8s 对外服务之 Ingress 1.1什么是ingress 1.2外部的应用能够访问集群内的服务有哪些方案&#xff1f; 1.3Ingress 组成 1.4Ingress-Nginx 工作原理 1.5ingress 暴露服务的方式 二、实操ingress暴露服务 前期.部署 nginx-ingress-controller 2.1基于host网络…

RabbitMQ的Windows版安装教程

文章目录 前言一、Windows安装RabbitMQ总结 前言 曾经写过一篇关于RabbitMQ的Ubuntu安装教程&#xff08;http://t.csdnimg.cn/5CYfC&#xff09;&#xff0c;当时使用的是Docker将RabbitMQ安装到虚拟机上&#xff0c;但是有很多小伙伴问Windows上如何进行安装RabbitMQ&#x…

flink重温笔记(十二): flink 高级特性和新特性(1)——End-to-End Exactly-Once(端到端精确一致性语义)

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 12 天啦&#xff01;学习了 flink 高级特性和新特性之 End-to-End Exactly-Once&#xff08;端到端精确一致性语义&#xff09;&#xff0c;主要是解决大数据领域数据从数据源到数据落点的一致性&#xff0c;不会容易造成…

官宣!百度智能云千帆产品发布会3月21日北京见!

回望2023大模型狂奔的一年&#xff0c;百度智能云千帆大模型平台无疑是浓墨重彩的一笔。自2023年3月27日正式问世后&#xff0c;百度智能云千帆大模型平台以突飞猛进的速度持续发展。从模型、应用到生态&#xff0c;“千帆”书写着自身在大模型时代的答卷。 作为全球首个一站式…

web开发踩坑记

问题&#xff1a;npm install 在纯ipv6环境先无法安装包 现象&#xff1a; ping -6 registry.npmjs.org 是通的&#xff0c;说明可以解析到ipv6地址 解决方法&#xff1a; 在hosts文件中强制添加 registry.npmjs.org 解析到IPV6地址的记录 原因分析&#xff1a; 怀疑是npm的bug…

指针的学习5

目录 sizeof和strlen的区别 sizeof strlen 数组和指针笔试题解析 一维数组 字符数组 二维数组 指针运算笔试题解析 题目1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#xff1a; 题目5&#xff1a; 题目6&#xff1a; 题目7&#xff1a; sizeof和…

Jmeter二次开发实现rsa加密

jmeter函数助手提供了大量的函数&#xff0c;像 counter、digest、random、split、strLen&#xff0c;这些函数在接口测试、性能测试中大量被使用&#xff0c;但是大家在实际工作&#xff0c;形形色色的测试需求不同&#xff0c;导致jmeter自带或者扩展插件给我们提供的函数无法…

MySQL GTID 简介 原理 应用场景 优点 注意事项

GTID&#xff08;Global Transaction Identifier&#xff09;是MySQL数据库中用于唯一标识事务的一种机制。GTID的引入旨在简化复制和故障恢复过程&#xff0c;确保数据一致性。在分布式系统和数据库复制中&#xff0c;GTID提供了一种跨多个数据库实例跟踪事务的方法。 GTID的…

vue3没有this怎么办?

在vue3中,新的组合式API中没有this,那我们如果需要用到this怎么办? 解决方法: getCurrentInstance 方法获取当前组件的实例&#xff0c;然后通过 ctx 或 proxy 属性获得当前上下文&#xff0c;这样我们就能在setup中使用router和vuex了 import { getCurrentInstance } from …

【无标题】linux 命令不生效,卡死

内核直接重启&#xff0c;不需要读取硬盘 [rootlocalhost opt]# ll-bash: /usr/bin/ls: Input/output error 解决方法 [rootlocalhost ~]# echo 1 > /proc/sys/kernel/sysrq [rootlocalhost opt]# echo b > /proc/sysrq-trigger

Redis中的SCAN渐进式扫描底层原理

Scan渐进式扫描原理 概述 由于Redis是单线程再处理用户的命令&#xff0c;而Keys命令会一次性遍历所有key&#xff0c;于是在命令执行过程中&#xff0c;无法执行其他命令。这就导致如果Redis中的key比较多&#xff0c;那么Keys命令执行时间就会比较长&#xff0c;从而阻塞Re…

代码随想录三刷 day17 | 二叉树之110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

三刷day17 110.平衡二叉树257. 二叉树的所有路径404.左叶子之和 110.平衡二叉树 题目链接 解题思路&#xff1a; 求高度用后续遍历&#xff0c;先得到左子树和右子树的情况&#xff0c;然后再进行判断&#xff08;左右中&#xff09;使用递归遍历 代码如下&#xff1a; class…

即插即用篇 | YOLOv8 引入 ParNetAttention 注意力机制 | 《NON-DEEP NETWORKS》

论文名称:《NON-DEEP NETWORKS》 论文地址:https://arxiv.org/pdf/2110.07641.pdf 代码地址:https://github.com/imankgoyal/NonDeepNetworks 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yaml

程序员常用的几种算法

程序员常用的几种算法 一、程序员算法汇总二、程序员常用的几种算法1.选择排序算法1.1 选择排序算法解析&#xff1a;1.2 示例代码&#xff1a; 2.插入排序算法2.1 插入排序算法解析&#xff1a;2.2 示例代码&#xff1a; 3.冒泡排序算法3.1 冒泡排序算法解析&#xff1a;3.2 示…

LeetCode买卖股票的最佳时机

文章目录 LeetCode买卖股票的最佳时机121 买卖股票的最佳时机Ⅰ题目描述代码 122 买卖股票的最佳时间Ⅱ题目描述代码 123 买卖股票的最佳时机Ⅲ题目描述代码一&#xff08;会超时&#xff09;代码二&#xff08;dp&#xff09; 188 买卖股票的最佳时机Ⅳ题目描述代码 LeetCode买…

题记(51)--L1-023 输出GPLT

目录 一、题目内容 二、输入描述 三、输出描述 四、输入输出示例 五、完整C语言代码 一、题目内容 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按GPLTGPLT....这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;四…