常量
作用:用于记录程序中不可更改的数。
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”);都是表示暂停的意思,等待用户信号;不然控制台会一闪即过,你来不及看到执行结果。