最近有同學發來這樣一段代碼,并提出一個問題,數組的下標為什么可以是負數?
#includeint main() { const char *s = "helloworld"; const char *p = s + 5; printf("%c ", p[-2]); return 0; }
關鍵是這段代碼,編譯運行都很順利。
首先需要搞懂下標的作用是什么,準確的說,它是個偏移量。
比如 a[3],數組名 a 作為數組首元素地址,下標 3 表示從這個地址開始向后移動 3 個元素,至于具體是幾個字節,得看什么元素。
所以 a[3] 完全等價于 *(a + 3),甚至把代碼寫成 3[a] 編譯器也沒意見,表示的都是一個意思。
如果把數組下標寫成負數,就表示向前偏移。
a[-1] 就是向前偏移一個元素,很顯然,前面這塊內存不屬于數組,不能這樣使用,所以很少見到數組下標是負數的。
但是對于這樣精心設計過的代碼,保證內存不會越界的情況下,完全沒有問題。
s 指向了字符 h,p 指向了字符 w,p[-2] 就是往前數兩個元素,所以打印出來的就是 l。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
代碼
+關注
關注
30文章
4968瀏覽量
73965 -
數組
+關注
關注
1文章
420瀏覽量
27357
原文標題:數組的下標可不可以是負數
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
C語言選擇的幾種不同方法介紹
\';
else if ( queue == 1 )
letter = \'S\';
elseletter = \'U\';
一種更簡潔、更快的方法是使用數組下標獲取字符數組的值。如下
發表于 12-12 07:31
C語言中除數為0屬于什么錯誤
0 的錯誤,以及援引數組元素時下標溢出等。
靜態錯誤又可以分為語法錯誤和靜態語義錯誤。語法錯誤指有關語言結構上的錯誤,如單詞拼寫錯誤、表達式中缺少操作數、括號不匹配等。靜態語義錯誤指語言意義上錯誤,如加法運算的兩個錯作數一個為
發表于 12-08 06:38
scanf函數介紹
\", a));正確
數組元素可使用的最大下標
int i,a[10]={1}; for(i=1;i<=10;i++) printf(%d\",a); 錯誤
int
發表于 12-02 06:07
數組的初體驗
程序中也需要容器,只不過該容器有點特殊,它在程序中是一塊連續的,大小固定并且里面的數據類型一致的內存空間,它還有個好聽的名字叫數組。可以將數組理解為大小固定,所放物品為同類的一個購物袋,在該購
物
發表于 11-25 08:06
二維數組介紹
大家不要認為二維數組在內存中就是按行、列這樣二維存儲的,實際上,不管二維、三維數組… 都是編譯器的語法糖。
存儲上和一維數組沒有本質區別,舉個例子:
int array[3][3
發表于 11-25 07:42
把CW32L010用FLASH模擬EEPROM
;
u16 FEE_data[5]={100,200,300,400,500}; // eeprom變量數組,通過函數讀寫。eeprom變量名稱→枚舉名→數組下標
int main(void
發表于 11-24 07:40
大數組程序無法運行怎么解決?
主控是103,程序中定義一個const類型 128k只讀數組,放在flash上,程序無法運行,堆棧都初始化不了,在keil編譯下正常,在rtthread studio下編譯無法運行,求教
是內存管理的問題嗎
發表于 09-15 06:21
如何使用閃存來保存 CYBT-343026 中的數組等數據?
您好,我正在嘗試使用 CYBT-343026 構建一塊電路板。
我想將數據存儲在一個簡單的數組中。T
即使斷電,數據也應該保留。我可以使用EEPROM,但由于數據非常簡單,所以我想使用內部閃存。
有沒有辦法在內部閃存中存儲大約20個字節的數據?
它應該是可讀和可寫的。
發表于 06-25 06:33
++和--運算時數據在正數時計算是正確的,負數時有時候會溜掉計數,為什么?
,稍微快點的時候數值如果是正數時正反轉都沒問題,計算得到的值也是正確的,但是到了負數區就出現計數不準的情況,感覺像是漏掉計數一樣,數值會越來越大。
發表于 06-23 07:25
在CCG3PA datasheet上看到LVTTL input, VDDD<2.7V,是不是說CCG3PA IO/I2C可以是1.8V電平的?
我在CCG3PA datasheet上看到LVTTL input, VDDD<2.7V,是不是說CCG3PA IO/I2C可以是1.8V電平的?
如果是的話,此時芯片供電來自于VBUS_IN ? VDDD供1.8V嗎?
發表于 06-03 10:01
stm32 DMA串口接收到數組,數組元素順序錯亂怎么解決?
配置DMA循環模式,使用HAL_UART_Receive_DMA(&huart1,buffer,4)函數將串口數據循環發送到4個元素的buffer數組內,上位機20ms發送一次
發表于 03-12 08:02
數組的下標為什么可以是負數
評論