C++学习

常量

作用:用于记录程序中不可更改的数。

C++定义常量两种方式

1.# define宏常量:

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

2. const修饰的变量

const 数据类型 常量名= 常量值
通常在变量定义前加关键字 const,修饰该变量为常量,不可修改。
如果在程序中对const修饰的变量进行赋值将会出现如下报错:error C2106: “=”: 左操作数必须为左值

标识符命名规则

标识符不能是关键字
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或下划线
标识符中字母区分大小写
注:C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配类型。

整型

在这里插入图片描述

sizeof关键字

//可以利用sizeof求出数据类型占用内存大小
//语法 : sizeof(数据类型 或者 变量)
short num1 = 10;
cout << “short占用内存空间为:” << sizeof(short) << endl;
cout << “num1占用内存空间为:” << sizeof(num1) << endl;

实型(浮点数)

在这里插入图片描述

float f1 = 3.14 和 float f1 = 3.14f区别

float f1 = 3.14该式子中,3.14会被系统默认为double型,然后因为f1为单精度的,所以最后结果为双精度的3.14转换成单精度的3.14
float f1 = 3.14f该式子中,3.14f直接表明3.14就是单精度的

科学计数法

在这里插入图片描述

字符型

在这里插入图片描述

字符串型

1.C风格字符串

在这里插入图片描述

2.C++风格字符串

在这里插入图片描述

Bool布尔类型

在这里插入图片描述在这里插入图片描述

数据的输入

在这里插入图片描述
小tips:全体注释 Ctrl+k+c

算术运算符

在这里插入图片描述

赋值运算

在这里插入图片描述
注:模等于这块写错了,在示例上中的"a%2"应该为“a%=2”

比较运算符

在这里插入图片描述

逻辑运算符

在这里插入图片描述

!!a 为非的非

三目运算符

在这里插入图片描述

Switch语句

在这里插入图片描述

判断时只能是整型或者字符型,不可以是一个区间,但执行效率比if高

循环结构

在这里插入图片描述

while(1)
{
}  //进行死循环,可用break弹出循环

While 的 小Tip

while (cin>>x)
    {
    ++count;
    sum += x;
    }

这也是死循环,但是当输入遇到文件结束标志时会停止循环
(方法:输入完数据后→回车→ctrl+z→回车)
显示如下:
在这里插入图片描述
在这里插入图片描述

空格输入和回车输入均可,最后ctrl+z结尾。

生成随机数

1.Int num =rand()%100 //生成0-99的随机数(伪随机数)
2.srand((unsigned int)time(NULL)) //利用当前系统时间生成随机数,因为用了time 所以需要使用#include 头文件,如果这个加在rand语句前面的话,则每次运行时随机数将都不一样

srand((unsigned int)time(NULL));//利用当前系统时间生成随机数,每次运行数值都会发生改变
int num2 = rand() % 100;//如果没有上面的srand语句的话,当运行过一次后,随机的数字就不会发生改变
cout << num2 << endl;

do …while循环语句

在这里插入图片描述
在这里插入图片描述

For循环语句

在这里插入图片描述
在这里插入图片描述

小tip: break也可以跳出。

break语句

在这里插入图片描述

continue语句

在这里插入图片描述

goto语句

在这里插入图片描述
在这里插入图片描述

数组

在这里插入图片描述

小tip:如果初始化数据的时候,没有全部填写完,会用0来填补。
在这里插入图片描述
第三种方式自动确定多少容量

一维数组名称用途

arr[5]中的arr即为数组名

1.可以统计整个数组在内存中的长度

sizeof(arr) 统计整个数组内存长度
sizeof(arr[0]) 某一个元素的内存长度
sizeof(arr) / sizeof(arr[0]) 可以获取整个数组元素的个数

2.可以获取数组在内存中的长度

cout<<arr<<endl; 可能打印出来形式为16进制
在这里插入图片描述
第一个元素和第二个元素地址相差4个长度

二维数组

在这里插入图片描述

二维数组数组名

在这里插入图片描述

函数

在这里插入图片描述

注意return 是返回的值要是函数名前面的返回值类型
在这里插入图片描述

void swap(int num1, int num2)
{
    //return:返回值不需要的时候,可以不写return
}

void swap2(int& num1, int& num2)
{
    //return:返回值不需要的时候,可以不写return
}

上面两段函数中,请注意 & 符号,第一个函数中形参为值传递,形参在函数中的变换不会影响到实参的值;但是第二个代码不一样,有了&符号,相当于形参是直接用实参在函数中进行运算,从而会影响到原实参的数值。

函数的常见样式

在这里插入图片描述

//1.无参数无返
void test1()
{
    cout << "测试1,无参数无返" << endl;
}

//2.有参数无返
void test2(int a)
{
    cout << "测试2,有参数无返  "<<"a="<<a << endl;
 
}

//3.无参数有返
int test3()
{
    cout << "测试3,无参数有返  " << endl;
    return 1000;  //注意函数名前面是int型,那么返回值return后面必须是int
}

//4.有参数有返
int test4(int a)
{
    cout << "测试4,有参数有返  " << endl;
    return a;
}

//使用函数
int main()
{
    test1(); //无参数无返函数的使用
   
    int a = 333;
    test2(a);//有参数无返函数的使用
   
    int b = test3(); //无参数有返函数的使用
    cout << "b=  " << b << endl;

    int c = test4(10000);
    cout << "c=  " << c << endl;//有参数有返函数的使用

    system("pause");
    return 0;
}

函数的声明

提前告诉编译器函数的存在,声明可以写多次,但是定义只能写一次

函数的分文件编写

在这里插入图片描述

1.在头文件中,声明函数时,建议不要简写(即用using),形参可以不写,但是形参类型必须要写;
2.源文件中写好各种函数;
3.如何关联头文件与源文件呢? 在“.cpp”源文件里的首行添加相对应的“.h”头文件,即#include “XXXXX.h”
4.如何在main函数的源文件中使用函数呢? 在main函数的源文件写相应的头文件,即#include “XXXXX.h”

指针

在这里插入图片描述

保存地址,指针就是一个地址
在这里插入图片描述

指针所占内存空间

32位操作系统 占用4个字节(X86)不管指针类型,都是这样的
64位操作系统 占用8个字节(X64)

空指针和野指针

在这里插入图片描述

内存编号为0-255的 是系统管的,我们不能对其进行访问
例:
int * p=NULL; //定义了一个空指针,但是空指针不能直接赋值
*p=100;//这句程序使错误的。
在这里插入图片描述

int * p=(int *)0x1100;//将一串16进制数,用(int *)直接转换成地址
小结:空指针和野指针都不是我们申请的空间,因此不要访问。

const修饰指针

在这里插入图片描述

Int a=10;int b=10;int *p=&a;
1.常量指针
在指针前面加一个const即为常量指针,
如,const int *p=&a
特点:指针的指向可以修改,但指针的指向的值不可以改。即常量指针p可以指向b(p=&b),但是不能修改a里面的值(*p)。
2.指针常量
Int * const p =&a
特点:指针的指向(p)不可以改,但是指针指向的值可以改(p=20)。
3.即修饰指针又修饰常量
const int * const p =&a
特点:都不能改。
小结:记忆方式:翻译法,代表指针,const代表常量,根据我们定义时两者的前后方向,说明了是指针常量还是常量指针,同时const后面的那一串则为不能改变的。
如const int p,则const在前面,则为常量指针,condt后面是
p,所以
p改不了
在这里插入图片描述

指针和数组

利用指针访问数组中元素
在这里插入图片描述

指针与函数
在这里插入图片描述

指针、数组、函数组合

见程序

#include <iostream>
using namespace std;

//冒泡排序函数
void bubbleSort(int * arr,int len)
{
    cout << "数组原顺序: " << endl;
    for (int i = 0; i < len; i++)
    {
        cout << arr[i] << "  ";
    }
    cout << endl;
    //开始排序
    //排序总轮数=元素个数-1
    //每次对比次数=元素个数-排序轮次-1
    for (int i = 0; i < len - 1; i++)
    {
        for (int j = 0; j < len - i - 1; j++)
        {
            if (arr[j]>arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
// 打印数组函数
void printArray(int * arr, int len)
{
    cout << "数组排序后的顺序: " << endl;
    for (int i = 0; i < len; i++)
    {
        cout << arr[i] << "  ";
    }
    cout << endl;
}

int main()
{
    int arr[] = { 4, 3, 6, 9, 1, 2, 10, 8, 7, 5 };
    //数组的长度
    int len = sizeof(arr) / sizeof(arr[0]);

    bubbleSort(arr, len);

    printArray(arr, len);

    system("pause");
    return 0;
}

结构体

在这里插入图片描述

即用户自定义结构类型

#include <iostream>
#include <string>
using namespace std;

//1.创建学生数据类型(自创类型)
//struct 语法
struct Student
{//成员列表
    //姓名
    string name;
    //年龄
    int age;
    //分数
    int score;
}s3;//s3为在定义结构体时顺便创建的结构体变量

//2.通过学生类型创建具体学生
//2.1  struct Student s1;
//2.2  struct Student s2={......};
//2.3  在定义结构体时顺便创建结构体变量

int main()
{
    //2.1  struct Student s1;
    struct Student  s1;
    //上一句写成 Student  s1;也可以
    //结构体创建变量时,struct关键字可以省略

    //给s1属性赋值
    s1.name = "张三";
    s1.age = 15;
    s1.score = 100;

    //2.2  struct Student s2={......};
    struct Student s2 = { "李四",19,90 };
   
    system("pause");
    return 0;
}

在这里插入图片描述

总结4:结构体类型的创建需要在main函数外面,同样不能放在使用的后面

结构体数组

在这里插入图片描述
在这里插入图片描述

结构体指针

在这里插入图片描述

#include <iostream>
#include <string>
using namespace std;
//定义学生结构体
struct Student
{
   //姓名
   string name;
   //年龄
   int age;
   //分数
   int score;
};

int main()
{
   //1.创建学生结构体变量
   Student s = { "zhangsan", 18, 100 };
   //2.通过指针指向结构体变量
   Student *p = &s;
   //3.通过指针访问结构体变量中的数据
   //通过结构体指针访问结构体重的属性,需要利用   '-> '或者用  "(*p)." 
   cout << "姓名:    " << p->name << "年龄:    " << p->age << endl;
   cout << "成绩:    " << (*p).score << endl;
   system("pause");
   return 0;
}

结构体嵌套结构体

结构体内部的结构体的定义放在前面。

在这里插入图片描述
在这里插入图片描述

结构体做函数参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.利用参数的引用,来改变实参(&)
如:

double grade(double midterm,double final, vector<double>& hw)
{
}

注意这里的vector& hw中的&表示引用的意思,&可以理解成这里的形参直接就是实参,只是改了一个别名。这里有一个const的话(const vector& hw),也改变不了实参值,只能只读。

小结:值传递不会改变实参的内容(相当于将实参复制给形参),地址传递和第三种方式会改变实参的内容

结构体中的const使用场景

在这里插入图片描述

结构体例题

函数定义:
在这里插入图片描述

主函数:
在这里插入图片描述
在这里插入图片描述

在这个例题中需要注意的有以下几点:
1.函数的定义中,形参用的是 struct Hero heroArray[] ,代表形参是一个结构体数组类型
2.在函数引用中,实参用的是heroArray(是变量的头地址)

小tips合集:

1.按住home(定位到行首)然后按下Shift+↓,就可以选中该行

2.system(“pause”);或system(“PAUSE”);都是表示暂停的意思,等待用户信号;不然控制台会一闪即过,你来不及看到执行结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值