C 指標訪問指向陣列的乙個小問題?求大神解答?

時間 2021-11-23 05:22:53

1樓:sliter不是jpg

想要解釋清楚這個事情其實是比較困難的。。

首先要從陣列開始說。你應該知道,形同int a這樣的陣列被稱為c風格陣列。c風格陣列在c/c++中並不能稱得上是一種資料型別。

a在語義上說是一種唯讀引用,而引用這種語法在c裡是不存在的(我不確定比較新的c標準有沒有加)。為什麼說a 是一種語義上的唯讀引用而非指標呢,這是因為陣列名和指標有相當多的不一樣。在大多數情況下,指標可以當陣列頭用,但是陣列名比指標額外地帶有一點資訊,就是陣列長度。

這就是為什麼很多函式在形式參數列中接收長度不明確的陣列時形式要表現為returntypefuncname(type *array , size_t length)。當你將陣列名作為引數傳給指標形參,他就失去了長度這一資訊了,這種就被稱為陣列的退化。除此之外,指標是變數,他的指向可變,而陣列名的位址不可變,表現出const的特徵。

a[n]這個訪問運算子實際表現出來就是在陣列基址a的基礎上偏移n位(取決於type,比如char就是偏移1個bit,編譯器會自動判斷),但實質上,並不是陣列的一種操作,而是指標的。根據C99標準,除了sizeof和&運算子以外,在設計上,陣列名會被隱式型別轉換為指標使用,即*(a+n)。陣列對於大多數語言都不是基本型別,從資料結構上來說,他是線性表的一種特例,一種公認的物理實現。

到c++開始,c++他爹認識到c風格陣列詭異的一些地方,做了一些改良。我也不敢妄評有沒有用,稍微提一點。在完全繼承c風格陣列的前提下,c++還利用OOP和模板元的思想將陣列封裝成了STL的array(定長陣列)和vector(可變長陣列),其中vector比較常用,大量的公司都對vector做過自己的優化版本。

在OOP的範疇被設計為一種特殊函式(運算子函式),可以進行過載。在c++11版本,你可以通過decltype關鍵字來驗證我上文說的事情,decltype會將c風格的陣列名推導為「引用型別」。當然,需要一點特殊的手段。

/*看下圖,b會被decltype推導為int[5],c作為形參表現為陣列a的引用,當我們比較c和b,他們理所當然的相等。那你說不對啊,c和b本來就是同一種型別(int [5])啊,但問題是a為什麼可以通過pass by reference的方式被c引用呢?int (&c)[5]這種特殊的形式本身就表明一點:

引用可以附帶長度資訊。看來,c++一點兒也不坦率。*/

補充一下:c/c++沒有p[-2]這種用法,據我了解只有python支援。c/c++從來就不支援,vector的find倒是支援。

第乙個是會有邊界檢查的問題,這個c/c++做得很差,現在有一些先進的ide比如clion做了靜態支援。即便不報錯,你也得不到你想要的結果。

2樓:xfl

初學C語言,不要去學什麼C++。

重要的事情,重複三次!

C語言裡的指標 ,本質上是乙個變數 !

C語言裡的指標 ,本質上是乙個變數 !

C語言裡的指標 ,本質上是乙個變數 !

C語言不是指令碼語言,需要編譯的,編譯完就不再去改二進位制檔案的,沒有直譯器,基本資料型別的變數長度是固定的。但如果你深入學習計算機系統原理,你會發現其實任何基本資料型別的指標,其自身空間大小都是機器位寬(CPU暫存器資料位寬)。

指標和其它基本資料型別一樣,

有變數名,有空間大小,有自身在記憶體裡的位址。

其實C語言裡的基本資料型別,除了空間長度不一樣之外,沒啥不一樣。(儲存到記憶體裡,全是二進位制數字)當你能理解這句話的時候,你應該明白,unsigned long 也可以拿來當指標使用。

至於 C語言的指標語法裡 "" 和 "*" 有什麼不一樣,我跟你說,我就沒覺得有啥不一樣!你可以自己定義個函式 int func(int ptr) 。你會發現,這其實和 int func(int *ptr) 沒區別。

只不過 "" 可以表示這是乙個陣列,方便直接分配空間,如 int arr[666]; 如果是直接指定空間大小的, arr 會退化成半殘指標——常量指標,只能讀值,不可寫值。

如果是 int arr = ; 我手機打字難試,你看看能不能改變 arr 自身的值,如果可以改變,則證明 "" 寫法其實和 "*" 其實是一回事。

3樓:胖子

除了p[2],題主也可以試試p[-2],2[p],會發現也沒問題。因為只是語法糖,等價於指標偏移後解引用。即,p[2]等價於*(p+2)。

「C專家程式設計」建議題主看看。

請教乙個C語言指標陣列問題?

郭建波 陣列指標 也稱行指標 定義 int p 10 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是10,也可以說是p的步長。也就是說執行p 1時,p要跨過10個整型資料的長度。例 int p 4 該語句是定義乙個陣列指標,指向含4個元素的一維陣列。所以陣列指標也稱指...

c 如何獲取指標指向的byte陣列長度?

Pluto Hades 簡單陣列的指標是沒有陣列總長資訊的,所以必須傳長度。通過陣列名獲取長度請參考bing的回答。都用上C 了,我建議就別搞這種C語法了。你可以封裝乙個byte類。不知道如何下手的話,可以參考一下qt的QByteArray類。 程式設計師檸檬 題目我看了幾遍,不知道我這樣理解對不對...

陣列和指標的乙個問題?

是這樣的。詳情請看 http www.在進入主題前,我們先看乙個例子 include int main int ptr int a 1 printf d,d n a 1 ptr 1 return 0 列印出來的值是多少呢?結果 2,5具體分析 對指標進行加1 操作,得到的是下乙個元素的位址,而不是原...