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)
。
已知語句解:只有c語言才會有可讀性這麼神奇的表述。int a=6
, 則執行了語句a+=a-=a*a
後,變數a
的值為多少?
程式是從右到左執行的,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.只發生在和當前文件流方向的相...