0 数据类型
1.数据类型字节数
http://www.suoniao.com/article/6987
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
2.数据类型取值范围计算方法
https://www.cnblogs.com/roma823/archive/2011/04/27/2101251.html
3.注意
1)char 、 unsigned char、 signed char不是一种
error: invalid conversion from ‘unsigned char*’ to ‘const signed char*’
可强制转换
如定义函数func1(char*)
变量var类型unsigned char
调用时候:
func1((char *)var)
2)禁止缩窄转换
1 数组
所有元素类型相同
1.1 静态数组 Static Array
1.1.1 基本特性
1)创建时长度已知
数组名是指针常量,不可更改。使用时可自动转换为指向数组首元素的指针,指向分配的n个(已定)字符空间
与指针的区别与联系:https://blog.csdn.net/weixin_51626258/article/details/122642039
2)定义的同时初始化,只能后续通过赋值更改相应值
1.1.2 char数组
char数组赋值(\0结尾)
a.对数组中字符逐个赋值
注1:赋值符号可省略,c++11通用大括号初始化
char a[10]={‘h’,‘e’,‘l’,‘l’,‘o’};
b.定义的时候直接用字符串赋值
char a[10]=“hello”;
注2:不能先定义再给它赋值
错误:char a[10]; a[10]=“hello”;
注3:创建具有n个元素的数组, c++编译器在编译的时候会确定数组中元素的数量,对于将字符数组初始化为字符串来说比较安全,其他时候最好别
int a[]=“hello”;
c.利用strcpy
char a[10];
strcpy(a, "hello");
1.1.3 string类
属于C++标准库
常见用法:
#include < string>
使用:std::string或using namespace std
c_str()
https://blog.csdn.net/liitdar/article/details/80498634
1.1.4 模板类array
C++11提供了模板类array,是定长数组的替代品
array<类型名, 元素个数> 数组名
1.2 动态数组 Dynamic Array
1.2.1 用new创建动态数组
将数组的元素类型和元素个数告诉new
用new[ ]创建数组,用delete[ ]释放内存
int size;
cin >> size;
int * pz = new int [size]; // dynamic binding, size set at run time
...
delete [] pz; // free memory when finished
1.2.2 模板类vector、array
C++98新增的标准模板库(STL)提供了模板类vector,是动态数组的替代品(自动new-delete)
eg:遍历
for (auto it1 = stop_group_.begin(); it1 != stop_group_.end(); ++it1)
{
std::cout << it1->group_name << std::endl;
for (auto it2 = it1->group_areas.begin(); it2 != it1->group_areas.end(); ++it2)
{
std::cout << it2->area_name << std::endl;
for (auto it3 = it2->area_points.begin(); it3 != it2->area_points.end(); ++it3)
{
std::cout << it3->x << " " << it3->y << " " << it3->index << std::endl;
}
}
std::cout << std::endl;
}
1.3 对比
1.3.1 sizeof 、 strlen、length
sizeof能求得静态分配内存的数组的长度,不能求动态数组长度
1.sizeof
sizeof是运算符,它计算的是系统分配的空间大小,不是存储数据的大小【如数组本身长度】
特性总结:https://blog.csdn.net/w57w57w57/article/details/6626840
https://blog.csdn.net/weixin_34392906/article/details/92630996
2.strlen
strlen是函数,()里面必须是字符串指针或者字符串常量,返回的是/0前面的字符个数。【如数组中字符串长度】
3.length()函数
用来获取字符串的长度。
1.3.2 size()函数
size()函数可以获取vector类型的长度。
c++中,在获取字符串长度时,size()函数与length()函数作用相同。
c.应用:数据打印用于debug
/// Debug for char hex
std::cout << DEBUG_LINE << "data response start" << std::endl;
for (int i = 0; i < sizeof(response); i++)
{
std::cout << " " << std::hex << " " << (short)response[i];
}
std::cout << DEBUG_LINE << "data response end" << std::endl;
/// Debug for vector hex
for(auto& i : response)
std::cout << std::hex << (int)i << " ";
std::cout << std::endl;
2 结构
2.1 结构体 struct
同时存储多种类型的数据
参考:https://blog.csdn.net/walkman_lfq/article/details/51250989
1.声明
内部声明:将声明放在main()函数中,紧跟在开始括号的后面。
外部声明:将声明放在main()函数的前面,所有的函数都可以使用这种类型的结构。
2.初始化
每个值占一行,或全在同一行。
将结构的每个成员初始化为适当类型的数据,进而可将结构的每个成员看做相应类型的变量。
3.成员赋值
4.结构数组
示例:
inflatable gifts[100]; //C++允许在声明结构变量时(声明结构后)省略关键字struct
cin>>gifts[0].volume;
注:gifts本身是一个数组,而不是结构,因此像gifts.price这样的表述是无效的。
5.指向结构的指针(对应于成员变量)
详见菜鸟教程
2.2 共用体union
一时存储多种类型中的一种
2.3 枚举enum
创建符号常量,代替const
3 指针
定义一个变量后,程序根据所声明的类型和符号名,会在内存中开辟相应所需空间来存储其值
指针也是变量,用于储存某值的地址,可用于访问对应地址的内存
3.1 普通指针
3.1.1 静态联编 Static Binding
将指针初始化为变量地址,即指针指向该变量的值
变量 在 编译时 分配有名称的内存(若通过声明创建数组等,则程序被编译时就为其分配内存空间,不管最终是否使用)
指针 为可通过名称访问的内存 提供了个别名
基本概念:
&取地址运算符:获取地址
*解引用运算符:获取地址对应的值
注:对指针解引用(*)前,要将指针初始化为一个确定的、适当的地址。
(1)eg:普通变量
a.声明同时初始化
int h = 5;
int * p = &h;//将p(而不是*p)的值设置为&h
b.声明完了初始化
int h = 5; // 实际变量的声明
int *p; // 指针变量的声明
p = &h; // 在指针变量中存储 h 的地址
cout << h; //5
cout << &h; //0x123
cout << p; //0x123
cout << *p; //5
cout << *(&a);//5=a
(2)eg:arr数组
3.1.2 动态联编 Dynamic Binding
在 运行时 分配未命名的内存以存储值,通过 指针 来访问内存(若在运行阶段需要数组等,则创建;若不需要,则不创建。还可以在程序运行时选择数组长度,创建动态数组见2.1.1)
具体步骤:
创建——删除——赋空
注:在Delete指针后赋值为NULL/0/nullpt(c++11)。
C++标准规定:delete空指针是合法的,没有副作用。
对一个非空指针delete后(delete是释放指针指向的内存,并不是指针本身所占有的内存),若没有赋NULL,为野指针,若再次delete的话,有可能出现问题。
Fun* ptr1 = new Fun;
delete ptr1;
// ptr1 = nullptr;//need c++11: https://blog.csdn.net/qq_42533853/article/details/88551757
// ptr1 = NULL;
ptr1 = 0;
https://blog.csdn.net/YYY_77/article/details/123101743
3.2 智能指针 模板类
用于管理动态内存分配
1.shared_ptr
(1)std::shared_ptr
template <class T> class shared_ptr;
shared_ptr 类型的对象能够获得指针的所有权并共享该所有权:一旦他们获得所有权,指针的所有者组就会在最后一个释放(或reset)该所有权时负责删除该指针。
(2)std::make_shared
template <class T, class... Args>
shared_ptr<T> make_shared (Args&&... args);
分配和构造一个 T 类型的对象,将 args 传递给它的构造函数,并返回一个 shared_ptr 类型的对象,该对象拥有并存储一个指向它的指针(使用计数为 1)。
2.unique_ptr
不共享指针