首页 > 行业 > > > 正文
C++ 一维数组
发布时间:2023-07-08 18:07:58   来源:哔哩哔哩  

一维数组定义&形式

是一组数据类型相同的变量,可以存放一组数据数组名[下标]

❗数组地址

数组在内存中的地址是连续的

C++将数组名解释为数组首个元素的地址


(相关资料图)

⚠数组名为常量,不能更改,例如int类型数组a使用 a++❎

指针值可以改变,int *p = a使用 p++✅

数组第0个元素的地址等价于数组首个元素的地址

数组第n个元素的地址:地址首个元素的地址+n

C++编译器将 数组名[下标]解释为    *(数组首个地址+下标)

地址[下标]解释为 *(地址+下标)

数组表示法&指针表示法

1.数组表示法

形式为 数组名[下标]地址形式为 (类型)&数组名[下标]

2.指针表示法

使用指针来表示数组地址,定义形式为 *指针名 = 数组地址(例如a或者a[下标])

取值形式为 *(指针名+下标)

地址形式为 指针名+下标

⚛联系

C++编译器将 数组名[下标] 解释为 *(数组首个地址+下标)

地址[下标]    解释为 *(地址+下标)

一维数组用于函数的参数

形式:   

void func (int * arr , int len);   

void func (int  arr[] , int len);

当且仅当用于函数头或函数原型中,int arr[]int *arr才都意味着arr为一个int指针(在操作系统中,int指针为8字节)

⚠长度(int len)必须传入,除非数组中有最后一个元素的标志

动态创建一维数组

栈内存很小,当有大量的数据需要存储时,应在堆上存储

语法

创建: 数据类型 *指针 = new 数据类型[数组长度]

释放: delete [] 指针

‼重点

1⃣动态创建的数组无数组名,不能用sizeof运算符(sizeof(指针)==8)

2⃣可以用数组表示法(arr[i])和指针表示法(*(arr+i))来使用动态创建的数组

3⃣释放动态分配的只能用delete [] 数组名,不能只用delete 数组名

4⃣不要用delete释放不是动态分配的内存(例如栈上内存、C语言malloc动态分配的内存)

5⃣不要用delete[]释放同一内存2次(第一次正常释放,第二次相当于释放野指针)

6⃣对空指针用delete[]是安全的(释放内存后,指针应置为nullptr,防止误操作)

7⃣如果内存不足,调用new 会发生异常,导致程序中止,如果在new关键词后面加(std::nothrow),则返回nullptr,不会产生异常

8⃣用delete[]释放数组时,不需要指定数组大小,因为系统会自动跟踪已分配的数组内存

数组排序qsort()函数

qsort()函数用于各种数据类型的数组进行排序

函数的原型为 void qsort(void base,size_t nmemb,size_t size,int (compar)(const void *,const void *))

回调函数决定排序的顺序

int compar (const void *p1,const void *p2)

如果函数的返回值<0,那么p1所指向元素会被排在p2所指向元素的前面。

如果函数的返回值==0,那么p1所指向元素与p2所指向元素的位置不确定。

如果函数的返回值>0,那么p1所指向元素会被排在p2所指向元素的后面。

❗其他细节

1⃣size_t是C标准库中定义的,在64位操作系统中为8字节的无符号整型(unsigned long long) , typedef unsigned long long size_t

2⃣形参的地址用void是为了支持所有类型,在回调函数中应具体化

3⃣排序的需求除了升序和降序,还有很多不可预知的情况,只能用回调函数。

举例

⚠注意事项

1⃣当直接打印char类型a的地址时,std::cout会把&a当做字符串来输出,导致乱码

解决办法:使用强制转换(void*)明确告诉编译器&a为地址

2⃣由于数组申请内存用来存放某一类型的数据,可以通过强制类型转换来存放其他类型的数据

3⃣在栈上申请内存时,注意栈溢出

大多数Linux发行版的GCC编译器,栈上内存为8M,即2^23^ 字节 = 8388608字节

Windows的Visual C++编译器,栈上内存为1M,即2^20^ 字节 = 1048576字节

在Windows栈上分配int类型的数组理论上最多有2^20^ 字节/4字节=262144个元素,但是栈上还会存储局部变量、函数参数、函数调用的上下文,所以实际上应少于262144个元素

关键词:

推荐内容

Copyright@  2015-2022 北冰洋器材装备网版权所有  备案号: 沪ICP备2020036824号-3   联系邮箱:562 66 29@qq.com