天天看點

淺析二維數組

介紹二維數組之前,簡單介紹一下數組的一些基本知識。

大家都知道數組是不能拷貝和指派的。

 **********************************************************************************************

        例如: 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,其實就是

元素的内部數組, 是以,元素内部數組大小 * 元素個數 = 二維數組所有元素大小。