介紹二維數組之前,簡單介紹一下數組的一些基本知識。
大家都知道數組是不能拷貝和指派的。
**********************************************************************************************
例如: int TestArray[] = {0, 1, 2, 3};
int TestArrayCopy[](ia); 錯誤 (不能使用一個數組初始化(initialization)另外一個數組)
int AnthorArray[3]; AnthorArray = TestArray; 錯誤 (不能使用一個數組指派(assignment)給另外一個數組)
**********************************************************************************************
是以我們把當我們使用數組名時,編譯器會為我們自動轉換為指向數組第一個元素(when we use the name of array, it is automatically converted to a pointer to the first element of the array),
舉個例子來說吧, int a[3] = {1, 2, 3};
一: 當我們使用數組名a時,編譯器自動為我們轉換為數組的第一個元素,由于數組的元素是int類型的,是以我們可以int類型的指針。 int* p= a; 此時如果進行p+ 1 操作, 跨度是一個元素
二: 假如我們使用的是&a, 就是整個數組了,是以我們要定義成 int (*p)[3] = &a; 此時如果進行p+ 1 操作, 跨度是整個數組
嚴格意義上來講, 在C++中不存在多元數組的,通常我們所指的多元數組,其實就是數組的數組(what is commonly referred to as a multidimensioned array is actually an array of arrays)
舉個例子來說吧, int a[2][3] = {1, 2, 3, 4, 5, 6};
一: 當我們使用數組名a時,編譯器自動為我們轉換為數組的第一個元素,由于不能存在多元數組,編譯器會認為隻有兩個元素,隻不過元素内部又包含數組,數組的類型為int[3]
是以我們用int (*p)[3]類型的指針。是以定義為int (*p)[3] = a; 此時如果進行p+ 1 操作, 跨度是一個元素(隻不過這個元素的内部又了數組int[3])
二: 假如我們使用的是&a, 就是整個二位數組了,是以我們要定義成 int (*p)[2][3] = &a; 此時如果進行p+ 1 操作, 跨度是整個二位數組
三: 在進行二位數組初始化時,我們要注意以下問題
初始化該二位數組: 正确做法: memset(a, 0, sizeof(a)); // 注意操作符sizeof(a),
不會對a進行任何轉換,大小為二位數組中所有元素的大小之和。
但是如果把該二維數組作為參數時,如void fun(int p[][3], int nSize)
前面已經提過,當我們使用數組名時,編譯器自動為我們轉換為數組的第一個元素,
是以 正确初始化方法為 memset(p, 0, sizeof(*p) * nSize) 其中*p,其實就是
元素的内部數組, 是以,元素内部數組大小 * 元素個數 = 二維數組所有元素大小。