陣列和指標常常伴隨一塊,傻傻的分不清楚。
今天在這裡就系統的總結一下陣列和指標問題。
陣列在資料結構中占有十分重要的地位。陣列在記憶體中連續儲存的。在使用之前要對其進行宣告定義。宣告定義時其大小必須是確定的常量,而不能是變數。同時宣告定義要進行初始化。對於二維陣列,在初始化時可以省略行,但是列不能省去。陣列名是首位址,可以作為賦值的右部分賦給指標。通過指標訪問陣列元素。陣列的索引是從0開始的,一旦超出陣列邊界,操作將會報錯。陣列可以作為類的成員變數,當陣列大小為零或者為空時,這個陣列占用0個位元組。這個陣列也被稱為柔性陣列或者動態陣列。這種陣列能夠變長,可以有效防止越界問題。
二維陣列的乙個操作也表示指標,指向該行的第乙個元素。例如定義char a[10][5],那麼a[4](注意下表從0開始)指向的就是第5行的第乙個元素,即 *a[4] 等於 a[4][0]。而此時的步長就是1(型別是char)。那麼*(a[4]+1)就是a[4][1]。而如果而a[4 +1]其加一的步長是5(每行5個元素)個1(每個char元素占用1個位元組)。
char a[10] = ,那麼a就表示&a[0]。而&a也表示為陣列的首位址,但是這個首位址與上面名稱所表示的首位址雖然值相同但是意義不同。a屬於char *指標,而&a屬於char(*)[10]指標。
如果定義乙個指標為 char *p = &a +1;那麼p指向**呢?這裡的&a+1應該指向a[10](如果存在的話),但是p-1卻是指向a[9]。這是因為p的指標型別與&a不是一種型別,等號右邊的+1步長是與&a型別一致,而p-1的步長是與p的型別一致。
指標是存放位址的變數,一般為int型。指標的步長是與指標指向的型別相關,這也很好的解釋了上述的步長問題。指標可以進行操作。例如宣告乙個char *p;那麼p[1]就表示p+1;其步長就是其型別相關的量,這裡就表示指標變數在記憶體中移動了4位,指向下乙個變數,指向的位置移動了乙個型別的長度(這裡是1)。
在stl中vector包裝的就是陣列,這也是vector為什麼能夠快速隨機訪問的原理了。而list的優勢在於頻繁的插入和刪除。其封裝的是鍊錶,這以後也是經常會碰到的。這裡就不再展開。
陣列的學習
陣列的學習 陣列的定義 1 陣列是一組有序資料的集合。陣列中各資料的排列是有一定規律的,下標代表資料在陣列中的序號。2 用乙個陣列名和下標來唯一的確定陣列中的元素,如arr 10 代表陣列中儲存十個元素的值。3 陣列中的每乙個元素都屬於同乙個資料型別。不能把不同型別的資料 如學生的成績和學生的性別 ...
陣列的學習
定義 在記憶體空間中開闢的一連串的空間,且長度不可變,儲存的資料型別必須要一致。宣告乙個變數就是在記憶體空間劃出一塊合適的空間 宣告乙個陣列就是在記憶體空間劃出一串連續的空間為什麼使用陣列 如果宣告的變數存在的值較多且同為一種型別的話,那麼宣告的變數就顯得冗餘累贅,可以使用宣告陣列來避免這種情況出現...
陣列的學習
int main 1 sizeof 陣列名 陣列名表示整個陣列,sizeof 陣列名 計算的是整個陣列的大小,單位是位元組 2 陣列名,陣列名代表整個陣列,此項操作取出的是整個陣列的位址 int sz sizeof arr sizeof arr 0 printf d n sz printf d n ...