C++学习笔记02--数组\字符串

01数组

1.1定义:将一到多个相同类型的对象串联到一起,所组成的类型.

定义:

int a[100]

int a   和 int b[1] 是不同的数据类型 虽然占用的空间大小相同

int b[3.14]   int c[-1]   int  d[0]   这些定义都是非法的

constexpr short x=3;    int b[x]  合法

初始化:

 1.缺省初始化

      int a[3];   全局变量默认初始化为0        局部变量初始化随机

 2.聚合初始化

      int a[3]={1,2,3} 

       int a[3]={1,2}  第三个元素默认为0

       int  a[]={1,2,3}  编译器自动类型推导为int[3]

       int a[3]={}  聚合初始化  默认值为0

Note:zhizhen

1.不能使用auto声明数组的类型

        auto b={1,2,3}   b不是int[3]

2.数组不能复制

        int a[3]={1,2,3}; 

        auto c=a; 数组作为右值退化为指针   c---int*

        auto & b=a;   b----int (&)[3]类型 

3.字符串数组的特殊性

        char str[]="Hello"   -------------char[6]

        字符串 编译器默认加上\0转义字符  表示字符读取结束

        char str1[]={'H','e','l','l','o'}  ------------------char[5]

1.2指针数组/数组指针/数组引用

指针数组:

int * a[3]      -----------------a是int *[3]类型的数组----元素是int*的指针

int x1,x2,x3;

int * a[3]={&x1,&x2,&x3};

数组指针:

int (*a)[3];---------------------a是int (*)[3]的指针-------------指向储存3个int的数组

int b[3];

int (*a)[3]=&b;

数组的引用:

int b[3];

int (&a)[3]=b;-----------a是一个int(&)[3]的引用

不存在引用的数组,因为数组储存的都是对象   不能使对象的引用.

数组对象是一个左值 ,不能被修改 

数组做右值时通常会转变为香型的相应的指针

int x=100;

int *ptr=&x;

cout<<*ptr<

cout<<*(ptr+0)<

cout<----x[y]=*(x+y)

数组到指针的隐式类型转换:

        数组做右值通常隐式的转化为相应的指针,但是会丢掉数组大小信息,可以通过引用来避免隐式转换

int a[3]={1,2,3};
auto b=a;       b----int*
auto & c=a;     c-----int(&)[3]

指向数组开头和结尾的指针   std::begin()   std::end()  std:: cbegin()   std::cend()

求数组的首指针:

int a[3]={1,2,3};

cout<

指针算数:

        增加  减少  比较   求距离  解引用   指针索引

增加减少都是和指针的类型相对应   比较> <都必须指向相同的数组 

int a[3]={1,2,3};  auto ptr =a;

解引用  *ptr

指针索引  ptr[2]=*(ptr+2)

数组求元素的个数:

int a[3];

cout<

数组的遍历:

int a[5]={1,2,3,4,5};


size_t index=0;             -----基于元素个数
while(index

02多维数组

本质:数组的数组

int a[3][4]

int b[3][4][5]   --从内到外b[3]-----int [4][5]-----int [5]

初始化:

缺省初始化:int x[3][4]

聚合初始化:int x[3][4]={1,2,3,4,5,6}  后面默认0

                    int x[3][4]={{1,2,3,4},

                                        {5,6,7,8},

                                        {9,10,11,12}}

遍历:

int x[3][4]={};

for (auto &p:x)       ---auto只能是对数组使用  为了保证第二个for  p是数组  故需要保留q为数组
{                    -----故采用 auto &
    for(auto q:p)
    {
        cout<

Note:

        多维数组可以隐式转化为指针   但是只有最高维度才会进行转换  其他维度信息保留.

03vector

C++标准库中的类模板   与数组相比可复制 可在运行期动态改变元素的个数

获取元素个数      x.size()

判断是否为空      x.empty()

插入元素       x.push_back(1);

删除元素      x.pop_back();    ......................................

vector的索引与遍历

vectorx1={1,2,3}

cout<x;
auto b=begin(x);
cout<<*b<

vector注意事项:

        添加元素后,可能是之前定义的迭代器失效

 多维度vector

std::vector>x;
x.push_back(std::vector());
x[0].push_back(1);
cout<>x{{1,2,3},{4,5,6}};


. 到->

vectorx;
cout<*p=&x;
cout<<(*p).size()<的容器指针  需要解引用为vector才能使 
                            ----------用类方法,    ->  直接使用指针来访问方法

cout<size()<

04字符串

c字符串本质也是数组

c语言提供了额外的函数来支持c字符串相关的操作  strlen   strcmp    

需要包含头文件   #include

char str[]="Hello";

auto ptr=str;

ptr指向H的地址,若要求出字符串的长度,则指针依次遍历直到\0,停止遍历

string 

是C++标准库中定义的类模板别名,用于內建字符串的替代品  

 与內建字符串相比  可以复制  可以动态的改变字符串个数

#include

string x="Hello world";
string y=x;
y=y+"!";

auto ptr=y.c_str();    ------转化为c字符串

持续更新,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

你可能感兴趣的:(c++学习笔记,c++,学习)