C C 沒有陣列

2021-04-07 09:49:00 字數 2212 閱讀 6855

在其它高階語言裡,不管是定義(宣告)還是引用,

a[i]

或a[3]

都是乙個整體。在

c/c++

裡,卻是乙個表示式:

a[i]

是運算子

連線兩個實體a和

i。 說

c/c++

並沒有陣列

,有以下幾條理由。

理由一:

c裡沒有陣列形式。

「陣列」名

a本身就是乙個指標,與常規指標不同的是,它是乙個不能移動的所謂常指標。

如在函式外有定義:

float a[3] = ;

首先在初始化資料段分配一塊能容納三個

float

數的空間,並填入三個初始值,然後定義乙個名為a指向

float

資料流的常指標,並使其指向該區域的首位元組。

理由二:「陣列」的定義,其實最終是對指標的定義。

說「指向

float

資料流」,和說「指向

float

型陣列」,是兩個概念。共性是,計算偏移量(我不說移動,因為常指標是不能移動的。)時,計算單位都是

float

型資料的位元組數。但是,陣列是有邊界的,你的下標不能超出邊界。而偏移量可以超出資料流的邊界(後果自負)。

很多書裡說,

c「陣列」沒有邊界檢查,是為了執行效率。但是,對邊界的檢查,系統開銷並不大。

c裡的「陣列」其實是個資料流,它的邊界只有一頭:常指標所指向的下邊界。

理由三:陣列名和下標竟然可以互換。

我們要訪問上面那個資料流的第

2個資料,可以使用

a[1]

,也可以使用

*(a + 1)

。兩者完全等價。我懷疑,

c的作者所提供的

a[i]

,僅僅是

*(a + i)

的同義詞。按照加法交換率,顯然,

*(a + i)

等於*(i + a)

。那i[a]

是不是也等於

a[i]

呢?測試結果:等於。更奇怪的是,不但

i[a]

等於a[i]

,1[a]

也等於a[1]!

看看下面的相等關係:

a[1]

等於*(a + 1)

等於*(1 + a)

等於1[a]

上面的懷疑或許有點道理了。

理由四:

a[i]

無非是*(a + i)

的同義詞。

對「陣列」的訪問,最終總是通過指標的。其基本形式是:

*(a + i)。

「陣列」名是乙個常指標,總是指向該區域的首址。「下標」其實是乙個邏輯偏移量。說它是「邏輯」的,意思是在計算時,需要乘以步長(資料的長度)。但是,這個「乘法」對你是透明的,不必關心它。指向所訪問資料的是常指標「加」偏移量。 在

x86系列

cpu的指令系統裡,有乙個基址變址定址方式。這種定址方式和

c對「陣列」的訪問方式很相似。常指標相當於基址,偏移量相當於變址。

我懷疑,這個基址變址定址方式是為

c訪問「陣列」而增加的。

理由五:

c「陣列」沒有上邊界。

對下面的定義

float a[3] = ;

我們不僅可以訪問

a[0]

、a[1]

和a[2]

,還可以訪問

a[3]

、a[4]等。c

陣列不知道自己的一畝三分到**為止。用

c/c++

開發,與用其它語言不同,程式設計員必須記住自己定義的陣列有多大。自己的家沒有柵欄,跑到鄰居割韭菜沒人管,但後果自負。

理由六:對「多維陣列」的訪問總是可化解成對「一維陣列」的方式。

誠然,不管是用哪種語言程式設計,最終生成的目標程式碼中,陣列總是被轉換成一塊連續的儲存區(即它是線狀的)。不同的是,在

c原始碼裡,所有的陣列,不管是幾維的,都是線狀的。在原始碼層面,都可以看作是一維的。定義了

inta[3][4];

可以用

a[2][3]

,也可以用

a[11]

訪問其第

2行、第

3列元素。 結論

c

裡使用下標運算子

,無非是使指向一串等型別元素的指針對該區域的操作看起來像運算元組而已。沒有這東西,習慣了其它高階語言陣列操作的編碼員會覺得不習慣。

mybatis 沒有資料插入,有資料更新

on duplicate key update 該語句是基於唯一索引或主鍵使用,比如乙個欄位a被加上了unique index,並且表中已經存在了一條記錄值為1,下面兩個語句會有相同的效果 insert into table a,b,c values 1,2,3 on duplicate key u...

睡眠分析沒有資料 商圈分析怎能沒有資料(第一集)

商圈分析的路線 與業務部門討論,主觀判斷影響銷售業績的因素。step2設定指標 從頭腦風暴會議中,梳理出若干指標。step3獲取資料 商圈資料 通常通過爬蟲技術獲取 店鋪資料 通常對現有店鋪進行收集。step4資料清洗 對於清洗過後的指標,進行各個維度的統計,並與門店業績進行相關分析。step6收斂...

Druid的SQL監控沒有資料

初學spring boot 使用druid時 沒有好好驗證,就發了這篇不太負責任的文章 現在來糾正啦 下面是我之前的描述。最近在學習spring boot,然後嘗試使用druid進行sql監控,但是一直沒有資料,糾結了好久,突然看見引的依賴應該是 com.alibaba druid spring b...