C++ | 数组(一维数组、二维数组)、字符数组、字符串

01 一维数组

数组,就是把相同数据类型的变量组合在一起而产生的数据集合。

  • 数据就是从某个地址开始连续若干个位置形成的元素集合。
  • 数组大小必须是整数常量,不可以是变量。
数据类型 数组名[数组大小];

数据类型 数组名[数组大小]={初值1,初值2, …};

数据类型 数组名[]={初值1,初值2, … ,初始值n};
一维数组的初始化
  • 需要给出用逗号隔开的从第一个元素开始的若干个元素的初值,并用大括号括住,后面未被赋初值的元素一般情况默认初值为0。

  • 如果数组一开始没有赋初值,数组中的每个元素都可能会是一个随机数。

  • 如果想要给整个数组都赋初值0,只需要把第一个元素赋为0。

  • 两个数组间不能直接用“=”运算符互相赋值,只能在数组元素之间互相赋值。

  • 在定义一维数组时,如果没有指定数组元素的个数,则编译程序会将数组长度按照初值的个数自动决定。

一维数组名称用途
  1. 可以统计整个数组在内存中的长度。sizeof(arr)
  2. 可以获取数组在内存中的首地址。cout << arr << endl;
  • 数组名是常量,因此不可以被赋值。
求数组最大值、逆置数组
#include 
using namespace std;

int main(){
    int arr[5] = {4,6,2,3,8};
    //求数组最大值
    int max = 0;
    for(int i = 0; i < 5;i++){
        if(arr[i] > max){
            max = arr[i];
        }
    }
    cout << max << endl;

    //数组逆置
    int start = 0;
    int end = sizeof(arr)/sizeof(arr[0]) -1;
    while(start < end){
        int tmp = arr[start];
        arr[start] = arr[end];
        arr[end] = tmp;
        start++;
        end--;
    }
    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]);i++){
        cout << arr[i] << endl;
    }
    return 0;
}
冒泡排序

在这里插入图片描述

#include 
using namespace std;

int main(){
    int nums[] = {4,2,0,5,1,7,3,8,9,6};
    int size = sizeof(nums)/sizeof(nums[0]);

    for(int i=0; i<size-1;i++){
        for(int j=0; j< size-i-1; j++){
            if(nums[j]>nums[j+1]){
                int tmp = nums[j+1];
                nums[j+1] = nums[j];
                nums[j] = tmp;
            }
        }
    }
    for(int i=0; i<size;i++){
        cout << nums[i] << endl;
    }
    return 0;
}

02 二维数组

数据类型 数组名[行数][列数];

数据类型 数组名[行数][列数] = { {数据1,数据2 }, {数据3,数据4} };

数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 };

数据类型 数组名[][列数] = { 数据1,数据2,数据3,数据4 };

C++ | 数组(一维数组、二维数组)、字符数组、字符串_第1张图片

二维数组的初始化
  • int name[2][2]类似于{{0},{0}}
二维数组名称用途
  1. 可以查看二维数组占用内存空间大小。
  2. 获取二维数组首地址。
// 二维数组
int nums[2][3] = {{1,2,3},{4,5,6}};
cout << nums << endl;
cout << sizeof(nums) << endl;
cout << &nums[0][0] << endl;
//输出
//0x7fff55cbf780
//24
//0x7fff55cbf780
特别提醒:
  • 如果数组大小较大(大概106级别),则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。

  • C++多维数组下标的设置,只允许第一维可以省略不定义,其他维数的下标则都必须清楚地定义出长度。

int arr[ ][3]={{1,2,3}, {2,3,4}}; // 合法的声明
int arr[2][ ]={{1,2,3}, {2,3,4}}; // 不合法的声明

03 memset

给数组中每一个元素赋相同的值有两种方法:
memest()
#include 
memset(数组名,值,sizeof(数组名));
  • 建议初学者使用memset赋0或-1。
  • 0的二进制补码为全0,-1的二进制补码为全1。
  • memset使用的是按字节赋值,即对每个字节赋同样的值。
fill()
  • 如果要对数组赋其他数字,使用fill

04 字符数组

1⃣️ 字符数组的初始化
  • 传统的{'a',‘b'}
  • 直接赋值字符串来初始化。字符串声明最重要的特点是必须使用空字符’\0’来带代表每一个字符串的结束。
  • 如果是先创建数据类型为char的字符数组再赋初值,那么开始编译此程序时会发生错误,如下所示:
char st1[26];
st1="1234567"; //错误的语法,因为无法直接把字符串常数值给数组正确的方法是使用strcpy()函数来给它赋予初值:strcpy(st1,1234567);
2⃣️ 字符数组的输入输出
3⃣️ 字符数组的存放方式

05 string.h头文件

#include 

string 字符串名称(个数,字符) ; //声明有重复字符个数的字符串

string 字符串名称1(字符串名称); //声明以字符串名称的字符串作为字符串名称1的初值

string 字符串名称1(字符串名称,起始位置,长度);
 //声明字符串名称的部分字符串作为字符串名称1的初值,但此声明方式的起始位置和长度是从0开始算起的
C++字符串操作
  • 字符串也可以通过指针方式来声明与操作。

C++ | 数组(一维数组、二维数组)、字符数组、字符串_第2张图片

1⃣️ strlen()

  • strlen()函数可以得到字符数组中第一个\0前的字符的个数。
strlen(字符数组);

2⃣️ strcmp()

  • strcmp()函数返回两个字符串大小的比较结果,比较原则是按字典序。
strcmp(字符数组1,字符数组2);

C++ | 数组(一维数组、二维数组)、字符数组、字符串_第3张图片
3⃣️ strcpy()

  • strcpy函数可以把一个字符串复制给另一个字符串。
strcpy(字符数组1,字符数组2);
  • 这里的复制包括了结束符\0

4⃣️ strcat()

  • strcat()可以把一个字符串接到另一个字符串后面。
strcat(字符数组1,字符数组2);

你可能感兴趣的:(#,C++语言)