数组
- 放到一块连续的内存空间中
- 数组中每个元素都是相同数据类型
- 通过下标访问数组中的元素
一维数组
三种定义方式
int arr[5];
//5表示数组长度int arr[5] = {10,20,4,5,2};
//数组元素可以直接在构造数组时候初始化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;
}
操作
- 可以统计整个数组在内存中的长度
sizeof(arr);
- 可以获取数组在内存中的首地址
- 数组首地址即数组第一个元素的地址
- 获取数组长度
len=sizeof(arr)/sizeof(arr[0]);
- 查看数组10进制的首地址
cout<<arr<<endl;
- 查看数组16进制的首地址
cout<<(int)arr<<endl;
- 查看数组数组元素的地址
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学习记录
二维数组
定义方式:
- 数据类型 数组名[row][col];
- int 数组名[2][3]={{1,2,3},{2,3,4}};
- int 数组名[2][3]={1,2,3,2,3,4};//按初始化器中顺序自动填充
- int 数组名[][3]={1,2,3,2,3,4};//按初始化器中顺序自动填充,并且行数大小根据初始化器中元素数量来决定(row=len(elems)/col+((len(elems)%col)?1:0))
访问第n行第m列: arr[n][m]
操作
- 查看占用的内存空间大小
- 查看二维数组的首地址
查看占用的内存空间大小:
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*’。
详细解决方案见文章:
补充
动态创建数组
int* next=new int[length];