【C++】数组arr[]
地址指针赋值数组的首地址 arr 或 &arr[0]int *pint*p=arr;数组的某个元素的地址 arr[i]int *p数组的整体地址 &arr;int(*p)[5](1) arr 等价于 &arr[0]表示数组首元素地址,指向数组第1个元素,arr + 1或&arr[0] + 1会跳过第1个元素【加上1个数组元素的字节数】,指向数组的下1个元素。arr或&arr[0]的地址类型为int
目录
零、引言
0.1 学习数据结构,我们要学习哪些方面?
- 抽象的数据结构
- 数据结构的物理储存地址
- 数据结构的逻辑储存
- 数据结构的操作:增、删、查、改某一元素及其复杂度
- 具体到某一语言下的数据结构
- 数据结构的初始化
- 如何查看一个数据结构自身的一些信息(元素个数、是否为空)
- 数据的增、删、查、改的方法
0.2 “数组”这个抽象数据结构的特点
1、在物理空间上连续储存。
坏处:数组的插入和删除时,要对后面的数组元素进行整体的移动。
2、在逻辑上是连续储存的数,可以顺序访问。支持用下标访问,即a[i]的形式(这种访问方式也叫随机访问)
3、遍历数组的复杂度是O(n),随机访问的复杂度是O(1)。
一、C++数组arr[] 的初始化
1.1成员列表初始化
//定义方式2:数据类型 数组名[元素个数] = {值1,值2 ,值3 ...};
//若大括号{ }内的元素个数小于定义的数组长度,则剩余数据默认使用0填充*[图示1]
int arr2[10] = { 100,90,80,70,60,50,40,30,20,10 };
可以省略数组长度,编译器会自动识别。
//定义方式3:
//数据类型 数组名[] = {值1,值2 ,值3 ...};
int arr3[] = { 100,90,80,70,60,50,40,30,20,10 };
1.2 用循环赋值的方式初始化
int main() {
int num[10];
for (int i = 0; i < 10; i++) {
cin >> num[i];
}
}
1.3 用对下标赋值的方式初始化
int main() {
//定义方式1:数据类型 数组名[元素个数];
int arr[10];
//使用数组下标对数组元素进行赋值或访问
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
}
二、数组自身信息
2.1 统计数组的长度(元素个数):sizeof()
数组占用内存空间大小:
sizeof(arr)
数组单个元素占用内存空间大小:sizeof(arr[0])
数组长度:sizeof(arr) / sizeof(arr[0])
代码示例:
int main() {
int num1[5] = { 1,2,3 };
int num2[5];
int len1=sizeof(num1) / sizeof(num1[0]);
int len2=sizeof(num2)/sizeof(num2[0]);
return 0;
}
局部变量结果:
可以看到,编程人员即使没有手动赋予一个数组初始值,但只要写明了这个数组的大小n,编译器会默认给它开辟元素大小*n个元素长度的空间,用sizeof也不会报错。
2.2地址
2.2.1 数组的首地址: 数组名arr即指向数组首地址
int main() {
int num1[5] = { 1,2,3 };
int* p1 = num1;
int* p2 = &num1[0];
return 0;
}
2.2.2 数组某个元素的地址:&arr[i]
int main() {
int num1[5] = {1,2,3,4,5};
int* p1 = num1;
int* p2 = &num1[0];
int* p3 = &num1[1];
int* p4 = &num1[2];
/*以此类推*/
return 0;
}
2.2.3整个数组的地址:& arr
注:如果要存放指向整个数组的地址,要用数组指针 typedef (*p)[n];
int main() {
int num[5] = { 1,2,3,4,5 };
int(* p)[5] = #
}
2.2.4 总结
举例:获取数组 int arr[5] 的各种地址:
地址 | 指针 | 赋值 |
数组的首地址 arr 或 &arr[0] | int *p | int*p=arr; |
数组的某个元素的地址 arr[i] | int *p | int *p=arr[i] |
数组的整体地址 &arr; | int(*p)[5] | int(*p)[5]=&arr; |
(1) arr 等价于 &arr[0]
表示数组首元素地址,指向数组第1个元素,arr + 1或&arr[0] + 1会跳过第1个元素【加上1个数组元素的字节数】,指向数组的下1个元素。arr或&arr[0]的地址类型为int *类型,使用int类型的指针(指向数组首元素的指针)接收。
(2) &arr
表示整个数组的地址,指向整个数组,&arr + 1会跳过整个数组【加上整个数组的总字节数】,如int *p = (int *)(&arr + 1),指针p指向数组的末尾。
&arr的地址类型为int (*)[数组长度]类型,使用数组指针(指向数组的指针)接收。
三、 数组的增、删、查、改
3.1 添加一个元素(arr[]不能,vector可以)
3.2 删除一个元素(arr[]不能,vector可以)
3.3 遍历数组(可以),查找一个元素(可以)
int main() {
int num[5] = {1,2,3,4,5};
for (int i = 0; i < 5; i++) {
cout << num[i] << " ";
num[i] += 10;
}
}
3.4 改变元素的值(可以)
int main() {
int num[5] = {1,2,3,4,5};
num[0] += 10;
}
四、二维数组(多维数组同理)
4.1 二维数组的初始化
4.1.1成员列表初始化
二维数组
int main() {
int num[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
}
三维数组
int main() {
int num[2][2][2] = {
{{1,2},{3,4}},
{{5,6},{7,8}}
};
}
4.1.2遍历初始化
二维数组
int main() {
int num[10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cin >> num[i][j];
}
}
}
三维数组
int main() {
int num[10][10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
cin >> num[i][j][k];
}
}
}
}
4.2 二维数组的信息
4.2.1行数、列数、元素个数
二维数组
int main() {
int num2[][3] = { {1,2},{3,4,5} };
int row = sizeof(num2) / sizeof(num2[0]); //有多少行
int size = sizeof(num2) / sizeof(num2[0][0]);//有多少个元素
int col = size / row; //有多少列
}
三维数组同理
4.3 二维数组的遍历数组,查找某个元素,修改元素
int main() {
int num[10][10];
//两个for循环遍历二维数组
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cin >> num[i][j];
}
}
//直接通过下标查找到元素,这种查找方式也叫做随机查找
num[2][3];
//修改元素的值
num[2][3]=100;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)