//
// main.cpp
// 二维数组
// 1.一个二维数组就像是若干个相同的数组放在一起,这对于存储多组数据非常有用。
// 2.一维数组(One-Dimension Array)
// 3.二维数组(Two-Dimension Arrays)
// 4.处理二维数组的时候直接当作一维数组就可以了每一行都是一个一维数组。
// 5.二维数组在存储的时候,是按照一行接着一行来存储的,并不是在定义的时候,眼睛看到的那样的小方块,因此
// 二维数组是可以省略行号的,因为本来就没有行这种说法,直接能指定列数就是可以的了。其本质也就是指定了分段的大小。
// 6.既然二维数组的本质就是一维数组,那怎么进行降维转换。
// 7.指向数组的指针是什么样子的?
// 也许本身问的这个问题就不好,应该说数组与指针之间的关系是什么,而不是问指向数组的指针,非要这样问,答案就是没有。
// Created by mac on 2019/4/10.
// Copyright © 2019年 mac. All rights reserved.
//
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int arr[5][5]={ //二维数组第一个参数不写也可以正常编译运行 arr[][5]
{1,2,3,4,5},
{2,4,6,9,0},
{3,6,0,2,7},
{4,8,2,6,6},
{5,1,5,3,2}
};
cout<<sizeof(int)<<endl;// 输出4字节
//二维数组降维转换为一维数组
int arr1[25];
int c=0; //c记录一维数组的长度
int *a=nullptr;
for (int i=0; i<5; i++) {
a=&arr[i][0];//指向第i行 第0列的元素
//之前while循环的一个错误写法
//错误的原因:指针就按照指针的规则来好了,sizeof(int)*5=20 相当于加了20 数组都越界了!!!
//编译器可以理解a++为sizeof(int),你没必要搞混概念。
// while(a<&arr[i][0]+sizeof(int)*5){
// arr1[c++]=*a++;
// }
//修改版本编译运行都能正常的通过
//每一行都当作一个一维数组来处理
while (a<&arr[i][0]+5) {
arr1[c++]=*a++;
}
//这个写法也是正确的,需要定义一个计数器。
// int cnt=5;
// while (cnt--) {
// arr1[c++]=*a++;
// }
}
//把一维数组输出
for (int i=0; i<c; i++) {
cout<<arr1[i]<<" ";
if(i%5==4){
cout<<endl;
}
}
//测试下指向二维数组的指针的用法
int *p=&arr[0][0];
p++;
cout<<*(++p)<<endl; //输出3
//二维数组的本质就是 一维数组的元素又是一维数组
//int *q=&arr;
int max1=arr[0][0];
int max2=arr[0][0];
for (int i=0; i<5; i++) {
for (int j=0; j<5; j++) {
//找主对角线最大元素
if((i==j)&&arr[i][j]>max1){
max1=arr[i][j];
}
//找次对角线最大元素
if((i+j==4)&&arr[i][j]>max2){
max2=arr[i][j];
}
}
}
cout<<max1<<" "<<max2<<endl;
return 0;
}
运行结果
4
1 2 3 4 5
2 4 6 9 0
3 6 0 2 7
4 8 2 6 6
5 1 5 3 2
3
6 9
Program ended with exit code: 0
Tips