C語言學習筆記 19 多維陣列和多維指標分析

2021-07-08 16:31:07 字數 2106 閱讀 8789

摘要:總結了指向指標的指標的用法,以及這樣使用的意義,分析了二維陣列名,二維陣列和二級指標的用法,文中用多個相關例項加深理解。

一、指向指標的指標

我們都知道,指標其實也是乙個變數,只是裡面存放的是位址而已,所以指標本身也是有位址的,既然有位址,那麼就可以用另外乙個指標去存放,於是就有了指向指標的指標。

1.指標變數在記憶體中會占用一定的記憶體空間。

2.可以定義指標來儲存指標變數的位址值。

比如我們看下面乙個例子:

#include int main(void)

結果輸出:

1010

10

p存放了變數a的位址,然後我們可以通過p列印出a的值,pp存放了指標p的位址,通過兩次解引用,我們也可以列印出a的值,紅色字型部分是等價的,利用*p存放a的位址,然後再解引用一次,不就可以找到a的值了嗎?這其實是乙個二維指標的最基本的應用。

二、為什麼需要指向指標的指標

因為指標本質上也是變數,既然是變數就可以使用指標去找到,而且,指標之間也存在傳值呼叫與傳值呼叫之間的問題。

那麼複習一下,什麼是傳值呼叫,什麼是傳址呼叫?其實顧名思義,乙個是傳的值,乙個是傳的位址,值就是利用變數直接複製過去,址自然就是指標,比如看下面的例子;

#include void fun1(int a,int b)

void fun2(int* a,int*b)

int main(void)

輸出結果如下:

#1 2

#2 1

這下可以看出傳值和傳址的區別了吧,這裡需要注意的就是當乙個函式體內部需要改變實參的值,則需要使用指標引數,在處理複雜結構引數的時候,一定要使用指標傳位址,效率提公升的不是一點兩點。

回歸正題,下面分析乙個指向指標的指標的例項,便於加深理解,例子如下:

#include #include #include int reset(char **p,int size,int new_size)//三個引數,第乙個是乙個二維指標,第二個引數是原先空間大小,第三個是裁剪後的大小

編譯和執行的時候會出現如下輸出;

這裡為什麼是-4呢?編譯的時候,警告又是從何而來的,其實這個知識點主要考察的並不是輸出結果,而是應該在意這個警告,任何編譯器的警告都不應該被我們忽略,從不相容的指標型別賦值,表面上,我們把陣列首元素的位址給了乙個指標,並沒有什麼不妥,指標給指標,乍一看型別相同,這裡p是乙個陣列指標,但是後面接的是4,而我們的二維陣列的型別的int *[5],乙個是int *[4],這就是型別的不同。至於為什麼會輸出-4,&p[4][2],是一次移動四個單元,那就是4*4+2,指向第18個單元。&a[4][2]一次是五個,也就是4*5+2,指向了第22個元素,指標指向同乙個陣列,相減得到的是下標差,所以等於-4.

五、以指標的方式遍歷二維陣列

我們一般遍歷二維陣列,可以使用下標方式,也可以使用指標方式,這裡在乙個例子裡面給出兩種方式的使用方法,具體例子如下:

#include int main(void)

,,};

int i;

int j;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

for(i=0;i<3;i++)

for(j=0;j<3;j++)

return 0;

}輸出結果這裡就不貼上來了,依次列印0到8。

六、小結1.c語言中其實本質上只有一維陣列,並且陣列大小在編譯期就要被確定。

2.c語言中的陣列元素可以是任意型別,也可以是乙個陣列,這就是二維陣列怎麼來的。

3.c語言中只有陣列的大小和陣列首元素的位址是編譯器直接確定的,這一點其實是第一點的重複說明,我們在定義陣列的時候,陣列型別就包含有大小的資訊在裡面。

這篇帖子就總結到這裡,如有不正確的地方還請指出,大家共同進步!

C語言學習筆記19 陣列指標和指標陣列分析

在c語言中 c語言中通過typedef為陣列型別重新命名 typedef int aint5 5 重新命名 aint5 iarray 定義 typedef float afloat10 10 重新命名 afloat10 farray 定義 注 pointer為陣列指標變數名 type為指向的陣列的元...

C語言 學習筆記7 指標與多維陣列

1.宣告乙個指向多維陣列的指標 int pz 2 pz指向乙個內涵兩個int型別元素的陣列 int pax 2 pax 是乙個內含兩個指標元素的陣列,每個元素都指向int的指標 2。看個例子 指標與多維陣列 include int main int pz 2 pz指向乙個內含兩個 int型別值的陣列...

C語言學習筆記《陣列》

1,已知陣列x有5個元素,精組y有6個元素.請分別對x和y排序。輸出x和y排序後的元素 include main y 6 int i,j,sum 0 for i 0 i 4 i int i,j,sum for i 0 i 9 i for i 0 i 9 i printf d t a i code c...