005:二維數組問題
在 C/C++ 中,我們將使用兩個下標的數組稱之為二維數組。相比於一維數組中,下標作為索引的存在,二維數組的下標索引往往帶有 行 和 列 的意義。如表示一個四邊形的四個二維坐標(x,y)這樣的場景,就可以使用二維數組進行存儲(使用結構體表示一個點的 x/y 坐標也是可以的)。
1. 二維數組的初始化
方式一:指定數據初始化
int a[3][2] = {0, 1, 2, 3, 4, 5}; // -Wmissing-braces
int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};
方式二:默認初始化
int a[3][2] = {0}; // 全為0
int b[3][2] = {}; // 全為0
int c[3][2]; // 全為隨機數
2. 二維數組的訪問
方式1:下標式
#include <stdio.h>
int main(int argc, char const *argv[])
{
(void)(argc);
(void)(argv);
int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
}
return 0;
}
方式二: 指針式
#include <stdio.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
(void)(argc);
(void)(argv);
int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("a[%d][%d]=%d\n", i, j, *(*(a + i) + j));
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("a[%d][%d]=%d\n", i, j,*(&a[0][0] + i * 2 + j));
}
}
return 0;
}
3. 指針式訪問說明
對於指針式訪問有兩種寫法,對應於數組地址+1 和 數組名+1 這兩種關系。
對於數組名訪問的方式:
- a+i 類型為
int (*)[2] - *(a+i) 類型為
int * - (*(a+i)+j) 類型為
int *
而使用數組地址訪問,直接按照線性關系移動即可。
