C 語言中陣列指標和指標陣列徹底分析

2021-08-24 21:37:34 字數 3496 閱讀 2573

################################

#                              #

#       基本知識               #

#                              #

################################

當然我們一切都是從最簡單的內建型別開始,最後我會做一些推廣。

先看一下基本的形式,我們從這裡起步!

--------------指標----------------

int a=10;

int *p=&a;

-------------指標的指標-----------

int b=20;

int *p=&b;

int **p2p=&p;

-------------簡單陣列-----------------

int c[10];//整數陣列,含有10個整數元素

file://也就是說每乙個元素都是整數

--------------指標陣列--------------------

int *p[10];//指標陣列,含有10個指標元素

file://也就是說每乙個元素都是指標

--------------陣列指標--------------------

int (*p)[10];//陣列指標,這個指標可以用來指向

file://含有10個元素的整數陣列

################################

#                              #

#      進一步提高知識          #

#                              #

################################

陣列,陣列的指標,指標的陣列,概念太多了。我接受概念一多的

時候,我就想把這些複雜的東西簡單一下。因為我太懶了,概念簡化

一下,記住更容易一點。所以我們這裡要認識一下上面這些概念本質。

這樣可以簡化概念,減少記憶的難度。

先看一段程式。

#include #include using namespace std;

int main();

int *p=&vint;

int **p2p=&p;

int *parr[2]=;

int (*p2arr)[2]=&arr;

cout<<"declaration [int vint=10] type=="《執行的結果如下:(我在前面加了行號#xx)

#01 declaration [int vint=10] type==int

#02 declaration [arr[2]=] type==int *

#03 declaration [int *p=&vint] type==int *

#04 declaration [int **p2p=&p] type==int * *

#05 declaration [int *parr[2]=] type==int **

#06 declaration [int (*p2arr)[2]=&arr] type==int (*)[2]

現在我們來分析一下結果。因為我們已經具有了第一部分的基本知識,我們現在

可以很明確區別出來我們宣告的型別。這裡主要有兩個很重要的部分,我們不過

是就事講事情,編譯器是如何實現的原理不在這裡討論之列。

--------#02:陣列------------

現在看#02,想到了什麼沒有呀?在編譯器看來陣列只是相對應型別的指標型別。

當我們把陣列傳遞給函式作為引數的時候,傳遞的是指標,所以我們可以利用

引數來修改陣列元素。這個轉化是編譯器自動完成的。

void f(int);

int a[2]=;

f(a);//這行等價於編譯器完成的函式轉化f(int *p)

也就是說這裡編譯器自動完成了int型別到int *的轉化,

注意是編譯器完成的,也可以說是語言本身實現的,我們

對此只有接受的份了。

-------#05:指標陣列---------------

指標陣列的編譯器內部表示也是對應型別的指標。

------#06:陣列指標----------------

陣列指標的編譯器內部表示就是有一點特別了。

編譯器(或者說是語言本身)有陣列指標這個內部表示。

由於c++語言的型別嚴格檢查的語言(當然還有一些是存在隱式型別轉化的)

所以我們下面的寫法是不能編譯通過的。

;//注意是3個元素陣列

int (*p2arr)[2]=&arr;//注意是指向2個元素陣列的指標

file://---------編 譯不能通過--------------

}################################

#                              #

#      初步小結                #

#                              #

################################

通過上面兩個小節的內容,大家應該基本明白了,

陣列,指標,指標陣列,陣列指標到底是怎麼一回事情了吧。

-----------補充開始-----------------------

關於陣列和指標的轉化,以及我們使用指標(++,--)等來運算元組,

是基於陣列在記憶體中是連續分布的。

但是我們使用「迭代器」的時候,情況是不一樣的。

這個問題本文不討論。

-----------補充結束---------------------

不過c++語言本身有很多詭異的地方(因為c++要考慮到跟c語言以及舊的c++版本相容)。

內建型別的這些性質特徵到了函式部分會有一點小的變化,不過如果你了解了編譯器做了

什麼以後的話,你也就不會太奇怪了。不過關於函式部分的內容我下次再說了。

現在回到上面的內容。我們這裡還是講一下內建型別。顯然一樣型別的變數是可以互相賦值。

不過當然還有一些其他情況也是可以的,比如型別的寬化,關於類的繼承體系問題等等。

當然了,不一樣的型別一般來說是不能互相賦值,當然這裡的例外就是強制轉化,

類的繼承體系等情況了。

看到這裡就會明白下面的程式為什麼會執行的了。

我這裡也把下面的程式作為今天內容的總結:

#include using namespace std;

int main()

; int *p=a;//根據上面說明,由於編譯器的參與,兩者型別轉化後一致

int vint=10;

int *parr[2]=;

int **p2p=parr;//上面分析,型別一致

return 0;

}

from:

C語言中陣列指標和指標陣列

如果看這兩個概念的英文翻譯可能會更容易理解 陣列指標 pointer to array 指標陣列 a array of pointer 顧名思義,陣列指標就是乙個指標變數,該變數指向乙個陣列。而指標陣列就是乙個陣列,這個陣列的元素都是指標,即每乙個元素都可以當成乙個指標變數使用。下面給出兩者的定義和...

C語言中的陣列 指標陣列 陣列指標

1 include 2 3 int main 4 執行結果 0xbfeefda9 0xbfeefdaa 0xbfeefdab12 70xbfeefda9 0xbfeefdaa 0xbfeefdab12 7以上執行結果可以得出如下結論 char str 3 1 str i strr i 2 str i...

C語言中的陣列指標與指標陣列

一 指標陣列和陣列指標的記憶體布局 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣列的指標 的簡稱。下...