C++语言基础入门(4) – 数组|序列

数组

  • 放到一块连续的内存空间中
  • 数组中每个元素都是相同数据类型
  • 通过下标访问数组中的元素

 一维数组

三种定义方式

  1. int arr[5]; //5表示数组长度
  2. int arr[5] = {10,20,4,5,2}; //数组元素可以直接在构造数组时候初始化
  3. int arr[] = {9,10,2,34,5} //不需要定义数组容量,直接在初始化器中初始化元素。

需要指出的是,C++与C#不同的是,C++允许数组初始化的元素小于数组容量。且数组构造时候,如果定义初始化的元素数量小于数组容量,默认会用0来填补剩余空间。例:int arr[5] = {10,20};//容量为5,初始化器中定义的初始化元素只有2个

数组赋值arr[下标索引]=value

数组遍历

正序输出数组元素

len=sizeof(arr)/sizeof(arr[0]);
for (int i=0;i<len;i++)
{
cout<<arr[i]<<endl;
}

操作

  1. 可以统计整个数组在内存中的长度sizeof(arr);
  2. 可以获取数组在内存中的首地址
  3. 数组首地址即数组第一个元素的地址
  4. 获取数组长度len=sizeof(arr)/sizeof(arr[0]);
  5. 查看数组10进制的首地址cout<<arr<<endl;
  6. 查看数组16进制的首地址cout<<(int)arr<<endl;
  7. 查看数组数组元素的地址cout<<&arr[0]<<endl;

注意:数组名是常量,不可以进行赋值操作。即这样是错误的int arr[5]={1,2}; arr={2,1};

示例:C++实现数组逆序

#include "stdlib.h"
#include <iostream>
using namespace std;

int main()
{
    int arr[]={5,4,3,2,1};
    int len=sizeof(arr)/sizeof(arr[0]);
    for (int i = 0; i < len&&(len-i-1)>i; i++)
    {

        int temp=arr[i];
        arr[i]=arr[len-i-1];
        arr[len-i-1]=temp;
    }
    for (int i = 0; i < len; i++)
    {
        cout<<arr[i]<<endl;
    }
    return 0;
}

2022/10/18 - 先写到这,洗完澡再安排。


2022/10/19 14:00学习记录

二维数组

定义方式:

  1. 数据类型 数组名[row][col];
  2. int 数组名[2][3]={{1,2,3},{2,3,4}};
  3. int 数组名[2][3]={1,2,3,2,3,4};//按初始化器中顺序自动填充
  4. int 数组名[][3]={1,2,3,2,3,4};//按初始化器中顺序自动填充,并且行数大小根据初始化器中元素数量来决定(row=len(elems)/col+((len(elems)%col)?1:0))

访问第n行第m列: arr[n][m]

操作

  1. 查看占用的内存空间大小
  2. 查看二维数组的首地址

查看占用的内存空间大小:

sizeof(arr)

    查看某一行占用内存空间:

    sizeof(arr[0])

    查看某一个元素占用内存空间:

    sizeof(arr[0][0])

    计算二维数组行数:

    sizeof(arr)/sizeof(arr[0])

    计算二维数组列数:

    sizeof(arr[0])//sizeof(arr[0][0]) //行的内存大小 除以单个元素的所占内存。

    二维数组首地址(16进制):

    int(arr)

    二维数组某一行首地址(16进制)

    int(arr[1])

    行之间地址差为 一行所占的内存大小:

    int(arr[1])-int(arr[0])=[[sizeof(int)=>4]*[col=>3]]=12 //此段落是伪代码。假设二维数组类型是int类型,列数为3

    二维数组某元素地址(16进制)

    int(&arr[1][0]) //第二行第一列的首地址

    同行不同列之间的元素 他们的地址差为 元素所占的内存大小:

    int(&arr[1][1])-int(&arr[1][0])=[sizeof(int)=>4]=4  //此段落是伪代码。假设数组类型是int类型

    示例:

    #include <iostream>
    using namespace std;
     
    int main ()
    {
       // 一个带有 5 行 2 列的数组
       int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
     
       // 输出数组中每个元素的值                      
       for ( int i = 0; i < 5; i++ )
          for ( int j = 0; j < 2; j++ )
          {
             cout << "a[" << i << "][" << j << "]: ";
             cout << a[i][j]<< endl;
          }
     
       return 0;
    }

    注意

    数组作为参数传给函数时,是传给数组首个元素的地址,而不是传给整个的数组空间。什么意思呢?就是说形参拿到的是指针的内存空间,即使用sizeof得到的并不是整个数组的字节数,而是指针的字节数,是int*指针的大小(数组被退化为指针使用sizeof)。所以我们不能通过上文的sizeof方式获取到数组大小了。

    错误代码:

    void getNextArr(char* ps,int next[])
    {
        int length=sizeof(next)/sizeof(next[0]);
    ...
    ...
    ...
    }

    sizeof(next)这句话会报警告,告诉我们‘sizeof’ on array function parameter ‘array’ will return size of ‘int*’

    详细解决方案见文章:

    中文解释:使用sizeof得到的并不是整个数组的字节数,而是指针的字节数,是int*指针的大小(数组被退化为……
    2022-10-24

    补充

    动态创建数组

    int* next=new int[length];
    作者:Miracle
    来源:麦瑞克博客
    链接:https://www.playcreator.cn/archives/programming-life/cpp/2093/
    本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
    THE END
    分享
    海报
    C++语言基础入门(4) – 数组|序列
    数组 放到一块连续的内存空间中 数组中每个元素都是相同数据类型 通过下标访问数组中的元素  一维数组 三种定义方式 int arr[5]; //5表示数组长度 int arr[……
    <<上一篇
    下一篇>>
    文章目录
    关闭
    目 录