C++_PART1复合类型——数组、结构、指针

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
不共享指针

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值