//
// 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
- 指向指針的指針如何在二維數組中進行應用?
- 同一個類中變量名與函數名字是不能重復的。下面的代碼編譯無法通過。是錯誤的寫法。
#include <iostream>
using namespace std;
class A{
int a;
int a (){}
};
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}