开始
-
C++程序中必须包含一个main函数
-
cerr
:标准错误 -
某个变量在不同cpp文件中都有,为了避免混乱,但使用时一般需要声明该变量
extern
-
类型别名
typedef
,typedef int wa
//wa是int的同义词 -
一般是.h文件的固定开头.以下为例,在别处引用时,#include SALE_DATA_H.h
#ifndef SALE_DATA_H #define SALE_DATA_H #endif
-
空指针:nullptr int* ptr = nullptr; //此时ptr是空指针
-
string表示可变长的字符序列,vector存放的是给定类型的可变长的序列
-
关于string:" "(双引号)
-
#include <string> using namespace std;
-
定义和初始化
string s1; string s2(s1); string s3("value"); string s3 = "value"; string s4(n, 'c'); //这里注意是单引号
-
操作
#include <string> using namespace std; string s; s.push_back('c'); //单引号,也就是只能在后面添加单个字符 s.empty(); //判空 s.size(); //字符个数 s[n]; //第n个字符的调用 s1+s2; //字符的拼接 <,>,<=,>= //比较 判断字符代表的数字的大小,可以判断字符是否相等
-
-
关于vector
-
定义和初始化
vector<T> v1; vector<T> v2(v1); vector<T> v2 = v1; vector<T> v3(n, val); //n个val值组成 vector<T> v4(n); //n个0值组成 vector<T> v5{a,b,c.....} vector<T> v5 = {a,b,c,....}
-
操作
v.empty(); v.size(); v.push_back(t); v[n];
-
-
关于迭代器iterator
-
迭代器运算符
*iter //返回引用 iter-> men //等价于(*iter).men ++iter; --iter; iter1 == iter2; iter += n; iter1 - iter2; // 两个迭代器之间的距离
-
-
多维数组
int *ip[4] //含有4个整型指针的数组 int (*ip)[4] //含有4个整型的数组
-
条件运算符
condition ? ture experssion:false experssion
-
位运算符
~ //位取反 1置0,0置1 ~expr & //位与 对应位置都是1,则为1,否则为0 ^ //位异或 对应位置有且只有一个为1时,则为1,否则为0 a^a^b=b 刷题中的只有一个元素 | //位或 对应位置至少有1位1,则为1,否则为0
-
指针
-
指针是一个值为内存地址的变量(或数据对象)
-
类似于身份证号,每个身份证号代表地址,指向某个人
-
在计算机中本来是地址-值,但是人类无法记住地址,就将地址转换为变量名
int year = 2018; int *ptr = &year; //将year的地址赋值给ptr指针
-
声明中的*和使用中的 *完全不同!!!!
- 声明中的*,代表当前变量是地址
- 使用中的*,代表指向地址对应的值
int num = 1024; int* ptr_num = # *ptr_num = 1111; //使用时的*代表间接运算符,指向ptr_num指向的1024,并将其修改为1111 cout << num << endl; // num = 1111;
-
取地址符&
-
char *的操作!!!!!!!
char ch = 'a'; char* ptr_ch = &ch; cout << ptr_ch <<endl; //此时输出的ptr_ch是乱码,因为char *在c++中默认是字符串 cout <<(void *)ptr_ch << endl; // 此时输出的ptr_ch是地址,因为通过了void *强制转换
-
指针类型
-
空指针:
int* ptr = nullptr;
int* ptr=NULL
- 指针很危险,如果只声明不定义的话,指针不一定会知道什么地方,所以要定义为空指针。
-
void*指针:一中特殊的指针类型,可以存放任意类型对象的地址
-
注意void*指针不可以直接修改对象的值,也就是
double pi = 3.14; void* ptr_pi = π *ptr_pi = 1122.1; //错误,void*指针无法直接修改对象的值
-
void*指针的用途
- 与别的指针进行比较
- 作为函数的输入和输出
- 赋值给另一个void*指针
-
-
-
-
引用:给对象起了一个别名
int&
-
例如:
int& refValue = int_value;
,如果int& refValue
,错误,引用必须初始化 -
引用只能跟对象绑定,
int& = 10
(错误)int& = root
(正确)- 如果非要引用常量,
const int& = 10;
(正确)
- 如果非要引用常量,
-
实际原理还是指针,在使用时与
*ptr
相同
-
-
指针与数组(存储在一块连续的内存空间)
-
指针任何时候都占4个字节空间
-
数组名等于数组的首地址
-
数组的类型:double[]
-
第i+1个元素可表示为
- 地址:
&num[i+1]
、num+i
- 值:
num[i+1]
、*(num+i)
- 地址:
-
数组名不能++,但是指向数组名的指针可以++
int num[] {1,2,3,4}; int* ptr_num = num; cout << *++ptr_num << endl; // 输出为2 cout << *++num << endl; //输出错误,数组名不能++
-
num的值与&num[0]的值相同,其实地址相同
-
-
指针的运算
- 指针的平移(++、–)
- 指针的算术运算(+2,-3)
- 指针可以减(加)去任意数,但是很危险,不知道指到哪里了
- 尤其是一些for循环的时候,很危险,不知道减到哪
-
动态分配内存
-
使用new分配内存:当运行阶段时才分配内存
int num1; //在编译阶段就要分配内存 int* ptr_int = new int; //在运行阶段分配内存 //上面这句话的意思是在运行阶段分配一个未命名的大小为int值的内存,并使用ptr_int指向该内存 //该空间只能由指针访问 delete ptr_int; //释放由new分配的内存,与new成对出现
-
delete释放
- 与new成对出现
- 不要释放已经释放的内存
- 不要释放普通内存
- 释放变量:
delete num
;释放数组:delete [] nums
(int * nums
-