关注公众号,后台回复
找书+ C++Primer
获取C++相关电子书。
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
在 C++ 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ]; //注意下标从0开始
新建、赋值与使用
#include <iostream>
usingnamespacestd;
int main() {
// 新建一个数组,长度为5
int arr[5] = {};
// 赋值数组
for (int i = 0; i < 5; i++) {
arr[i] = i * 2; // 将数组的每个元素赋值为其索引的两倍
}
// 使用数组,输出数组的每个元素
cout << "数组的元素为:" << endl;
for (int i = 0; i < 5; i++) {
cout << "arr[" << i << "] = " << arr[i] << endl;
}
return0;
}
一维数组名的用途
-
统计数组在内存中的长度。 -
获取数组再内存中的首地址。
#include <iostream>
usingnamespacestd;
int main() {
// 新建一个数组,长度为5
int arr[5] = {0, 1, 2, 3, 4};
// 统计数组在内存中的长度
int arraySize = sizeof(arr) / sizeof(arr[0]);
cout << "数组的长度为:" << arraySize << endl;
// 获取数组在内存中的首地址
cout << "数组在内存中的首地址为:" << arr << endl;
// 使用数组,输出数组的每个元素
cout << "数组的元素为:" << endl;
for (int i = 0; i < arraySize; i++) {
cout << "arr[" << i << "] = " << arr[i] << endl;
}
return0;
}
两个地址段差多少
这两个地址相差的长度可以通过简单的减法计算:
-
地址1(数组 arr
):000000000014FD08
-
地址2(数组 arrb
):000000000014FD38
将它们转换为十进制并相减即可:
000000000014FD38 - 000000000014FD08 = 0x30
换算为十进制:
0x30 = 48 字节
因此,这两个地址相距 48 字节。
在这个上下文中,两个数组 arr
和 arrb
都是长度为 6 的数组,而它们的首地址相距 48 字节,这可以通过以下几点来理解:
1. 数组的数据类型决定了内存占用
数组在内存中的总大小取决于其元素的数据类型和长度。如果数组 arr
和 arrb
的长度都是 6,那么每个数组占用的字节数为:
假设 arr
和 arrb
是以下几种常见的数据类型:
-
int
类型:在大多数 64 位系统中,int
的大小是 4 字节,因此一个长度为 6 的数组占用 字节。 -
float
类型:float
通常也是 4 字节,因此数组占用同样是 24 字节。 -
double
类型:double
通常是 8 字节,因此数组占用 字节。
2. 地址差说明内存布局
两个数组的首地址相距 48 字节,说明在内存中它们是连续分布的:
-
如果数组的元素是 double
类型,每个数组正好占用 48 字节,因此arrb
的起始地址正好紧接在arr
的末尾。 -
如果数组的元素是 int
或float
类型(占 24 字节),那么地址间的 48 字节 说明两者之间存在 24 字节的对齐间隔,可能是由于内存对齐或其他结构性分配导致。
3. 内存对齐的可能性
内存对齐是编译器在分配内存时,为了提高访问效率而自动插入的间隔。比如:
-
如果系统要求数据按 8 字节对齐,则即使 arr
只占 24 字节,下一个数组arrb
的起始地址也会向上对齐到最近的 8 字节倍数,这可能导致实际间隔增加。
结论
-
如果 arr
和arrb
是double
类型数组,两个地址相距正好等于arr
的大小(48 字节),表示没有额外间隔。 -
如果是其他数据类型,可能由于内存对齐或其他原因,导致间隔大于数组的实际大小。
要具体确认,可以查看数组的数据类型和系统的对齐策略。
练习案例-5只小猪称体重
#include <iostream>
usingnamespacestd;
int main() {
// 新建一个数组,长度为5,存储五只小猪的体重
int weights[5] = { 250, 300, 275, 320, 290 };
// 输出每只小猪的体重
cout << "五只小猪的体重分别为:" << endl;
for (int i = 0; i < 5; i++) {
cout << "小猪 " << i + 1 << " 的体重是 " << weights[i] << " 公斤" << endl;
}
// 找出最重的小猪
int maxWeight = weights[0]; //已经从0下表开始找了
int maxIndex = 0;
for (int i = 1; i < 5; i++) {
if (weights[i] > maxWeight) {
maxWeight = weights[i];
maxIndex = i;
}
}
// 输出最重的小猪
cout << "最重的小猪是小猪 " << maxIndex + 1 << ",体重是 " << maxWeight << " 公斤" << endl;
return0;
}
练习案例-数组元素逆置
#include <iostream>
usingnamespacestd;
int main() {
// 新建一个数组,长度为5
int weights[5] = { 250, 300, 275, 320, 290 };
// 输出原始数组
cout << "原始数组的元素为:" << endl;
for (int i = 0; i < 5; i++) {
cout << weights[i] << " ";
}
cout << endl;
// 逆置数组元素
int start = 0;
int end = 4; // 数组下标从0开始,所以最后一个元素的下标为4 也可以用 sizeof(weights[0]) - 1
while (start < end) {
int temp = weights[start];
weights[start] = weights[end];
weights[end] = temp;
start++;
end--;
}x
// 输出逆置后的数组
cout << "逆置后的数组元素为:" << endl;
for (int i = 0; i < 5; i++) {
cout << weights[i] << " "; // 末尾加空字符串
}
cout << endl;
return0;
}
经典算法-冒泡排序
#include <iostream>
usingnamespacestd;
// 定义颜色代码
#define RESET "
评论