正確理解C語言指標中的 a 1,假設a為乙個陣列

2021-08-28 10:26:43 字數 1657 閱讀 6839

1.int a[5]=; int p=(int)(&a+1); printf("%d",*(p-1)); 答案為什麼是5?

這個問題的關鍵是理解 &a

a是乙個陣列名,也就是陣列的首位址。

對a進行取位址運算子,得到的是乙個指向陣列的指標!!!!這句話尤為重要!

也就相當於

int (*p) [5] = &a;

p 是乙個指向陣列的指標,它指向的是乙個包含 5 個 int 元素的陣列!!

那麼執行 &a+1 後,p 移動了乙個陣列的距離,p 的偏移量相當於 p + sizeof(int) * 5,指向 a 陣列最後乙個元素的後一位 !!

而程式中強制將指標p轉換成乙個int*,那麼p -1 其實就是 p - sizeof(int)

所以,p -1 指向了陣列中的最後乙個元素,也就是 5

以下輸出分別是多少?

#include int main()

; int *ptr = (int *)( &a + 1);

printf("%d, %d, \n", *(a+1), *(ptr-1) );

return 0;

}

答案:2, 5

解釋: a 為大小為5的陣列,a表示陣列的首位址,&a表示陣列a的位址,&a+1表示移動了乙個a陣列的大小的距離,ptr + sizeof(int) * 5, 因此 ptr是乙個指向a的最後乙個元素的後一位的指標(ptr跨過了a的所有元素)。

因此,(1)*(a+1)表示 a 的首位址之後的乙個元素,即 a[1]=2; c 語言和 python都是 0-index;*

(2)*(ptr-1)表示指標 ptr 移動了一位,ptr - sizeof(int), 因此指向a的最後乙個元素a[4]=5;

(3)因此輸出為2和5。

這裡的關鍵在於區分a + 1&a + 1中移動的「1」是不同的,前者只移動sizeof(int),後者移動

sizeof(int) * sizeof(a)

已知語句int a=6, 則執行了語句a+=a-=a*a後,變數a的值為多少?

解:只有c語言才會有可讀性這麼神奇的表述。

程式是從右到左執行的,a的初始值為6:

(1)第一步:a=a-a*a=6-6*6=-30,此時a=-30

(2)第二步:a=a+(a-a*a)=(-30)+(-30)=-60,此時a=-60

注意:在開發過程中,寫這種語句的程式設計師是要被**的(手動滑稽)~

如何正確理解C語言的檔案

c語言的檔案是 c語言的基礎知識,掌握c語言檔案需要了解哪些東西呢?這裡已經給大家詳細列出了知識點 檔案c語言中,把檔案看做乙個字元的序列,也稱字元流 沒有格式 可以簡單認為是分為 文字檔案 以某種編碼儲存顯示的字元 二進位制檔案 以補碼格式儲存 其實是按資料的組織形式來分的 文字檔案 ascii檔...

正確理解Java中的Future

說到這個相信很多剛入行的程式設計師,對這個並不是很熟悉,這個單詞的意思是未來 簡單的給它闡述一下 這是乙個物件,儲存的耗時操作給它賦的值,我們先拿到他的引用,等他有值了,就可以使用。通俗的講,就是我拿到乙個變數的引用,裡面沒有值,子執行緒計算完了,把值賦值給它,我後面就可以用,不用我一直等子執行緒執...

正確理解CSS中的margin合併

最近在學習很多開發過程中容易忽悠但是又很重要的知識點,很多時候用的少不代表它不重要,這裡將它們寫出來以記錄,如果有寫的不好的地方請指正。margin合併是指塊級元素的上外邊距與下外邊距有時會合併為單個外邊距,有兩點需要理解。1.在塊級元素中,不包括浮動和絕對定位元素 2.只發生在和當前文件流方向的相...