數組和指針
問題導引
作為函數參數的數組名
問題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定義一個數組類型:
定義數組指針有一下三種方式:
輸出:
指針數組,它是數組,數組中的元素為指針。
其實就是我們熟知的存資料的數組。
他又分兩種:棧區指針數組(系統自動配置設定空間)與堆區指針數組(程式員通過malloc new配置設定空間)
不申請記憶體空間:
運作結果:
動态申請記憶體空間: