天天看點

C語言之數組指針、指針數組

​​數組和指針​​

問題導引

作為函數參數的數組名

問題1:我們可以使用任何一種聲明,但哪一個更準确一些呢?

代碼上看指針數組與數組指針

數組指針:指向數組的指針

數組指針的定義

方式一

方式二

方式三

指針數組:數組元素為指針

棧區指針數組

堆區指針數組

數組和指針

指針和數組并不是相等的。為了說明這個概念,請考慮下面兩個聲明:

聲明一個數組時,編譯器根據聲明所指定的元素數量為數組配置設定記憶體空間,然後再建立數組名,指向這段空間的起始位置。聲明一個指針變量的時候,編譯器隻為指針本身配置設定記憶體空間,并不為任何整型值配置設定記憶體空間,指針并未初始化指向任何現有的記憶體空間。

是以,表達式​<code>​*a​</code>​是完全合法的,但是表達式​<code>​*b​</code>​卻是非法的。​<code>​*b​</code>​将通路記憶體中一個不确定的位置,将會導緻程式終止。另外,如果是​<code>​b++​</code>​的話是可以通過編譯的,而​<code>​a++​</code>​卻不行,因為a是一個常量值。

當一個數組名作為一個參數傳遞給一個函數的時候發生什麼情況呢?我們現在知道數組名其實就是一個指向數組第1個元素的指針,是以很明白此時傳遞給函數的是一份指針的拷貝。是以函數的形參實際上是一個指針。

此時,系統也會對指針進行拷貝,然後進行一系列函數操作,當對資料操作的時候,指針指向的仍然是原資料,操作的仍是原資料本身,是以這裡的即使對指針拷貝也是當做實際參數。

但是為了使程式員新手容易上手一些,編譯器也接受數組形式的函數形參。是以下面兩種函數原型是相等的:

答案是指針形式。因為實參實際上是個指針,而不是數組。同樣sizeof arr值是指針的長度,而不是數組的長度。

現在我們清楚了,為什麼一維數組中無須寫明它的元素數目了,因為形參隻是一個指針,并不需要為數組參數配置設定記憶體。另一方面,這種方式使得函數無法知道數組的長度。如果函數需要知道數組的長度,它必須顯式傳遞一個長度參數給函數。

表示:數組a中的元素都為int型指針

元素表示:<code>*a[i]</code> 、 <code>*(a[i])</code>是一樣的,因為[]優先級高于*

表示:指向數組a的指針

元素表示:<code>(*a)[i]</code>

從代碼聲明中看的出來,他們倆隻有一個括号的區分,那麼下面我們來具體說明一下:

數組指針,它是指針,指向數組的指針。

它是指針,它是指針,它是指針。重要的事情說三遍。

數組的類型由元素類型和數組大小共同決定,例如:​<code>​int array[5]​</code>​ 的類型為 ​<code>​int[5]​</code>​;

c語言可通過typedef定義一個數組類型:

定義數組指針有一下三種方式:

輸出:

C語言之數組指針、指針數組

指針數組,它是數組,數組中的元素為指針。

其實就是我們熟知的存資料的數組。

他又分兩種:棧區指針數組(系統自動配置設定空間)與堆區指針數組(程式員通過malloc new配置設定空間)

不申請記憶體空間:

運作結果:

C語言之數組指針、指針數組

動态申請記憶體空間:

C語言之數組指針、指針數組

繼續閱讀