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

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^4
    float e2 = 3.14e-4;    // 3.14 * 0.1^4
    cout << "科学计数法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;
}
  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_happiness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值