作為萌新的小週末,指標的問題一直讓我很頭疼
特意找了幾道關於指標的面試題,一起來做一下
int main()
; int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
} //程式的結果是什麼?
我們先來看第乙個,*(a+1)
我把他分解成 *和(a+1)兩部分
(a+1)為陣列加一,隱式轉成了陣列指標,在進行解引用操作,得到a[1]上的元素
即為2。
接著我們來看一下這個操作
int *ptr = (int *)(&a + 1);
首先是(&a+1):跳過乙個陣列,指向陣列外邊了(5右邊的數)
再進行強制轉換成 int星型別,並傳到變數ptr中
*(ptr-1)即為指標的加減運算,向左移乙個int整形即得到5
struct test
*p;
//假設p 的值為0x100000。 如下表表示式的值分別為多少?
int main()
; int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf( "%x,%x", ptr1[-1], *ptr2);
return 0;
}
int *ptr1 = (int *)(&a + 1);
和第一題有點類似,&a+1跳過整個陣列,取到陣列外面的位址,即4右邊的那個數,再轉成int星變數,傳給指標變數ptr1。
ptr1[-1]等價於*(ptr-1),即為4
int *ptr2 = (int *)((int)a + 1);
a為陣列的首元素位址,我們將他強制轉成int型,變為乙個數字,這裡設為0x100
(int)a + 1=> 0x101 再將其轉成int*型別傳到變數prt2中
prt2=>0x101,0x102,0x103,0x104 四個位元組// 00 00 00 02
這四個位元組的內容
當我們對ptr2進行解引用,*ptr2,0x104被當成高位了,最終的列印結果2000000
這裡我們稍微介紹一下位元組序
大端位元組序 0x 00 00 00 01這裡0x104為高位,以小端位元組序儲存,輸出的就是02 00 00 00小端位元組序 0x 01 00 00 00 地位放在低位址上
#include int main(int argc, char * ar**)
; int *p;
p = a[0];
printf( "%d", p[0]);
}
很多人都認為陣列的值是
其實不是,這裡有乙個陷阱,有三個括號表示式,實際的陣列是a[3][2]=
1 35 0
0 0這樣乙個二維陣列
p[0]相當於 (*a)[0]即為1
幾道筆試題
出處 一 程式設計題 30分 現代的處理器提供了compare and swap原子操作 int compare and swap int pv,const int cv,const int nv 即比較 pv與cv,如果相等,則把 pv值替換為nv並返回 pv原值,否則返回 pv的值。請利用上述原...
幾道筆試題
1.在開啟的子視窗重新整理父視窗的 如何寫?window.opener.loaction.reload 2.寫出乙個ajax post請求伺服器資源並提公升返回資料的 片段,可以使用你熟悉的任何第三方js框架。ajax sucess function retval error function 3....
幾道C 筆試題
include using namespace std class a void fun virtual void print intm class b publica intmain 上例執行結果表明 1.建構函式中呼叫虛函式,無法實現多型。2.通過非虛函式呼叫虛函式,也可以實現多型。includ...