1.下面**輸出結果是什麼?
int main()
; int
*ptr = (int
*)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
system("pause");
return
0;}
解析:* (a + 1):此處a代表陣列首元素的位址,那(a + 1)就代表第二個元素的位址,* 解引用,* (a + 1) = 2。
*(ptr - 1): int *ptr = (int *)(&a + 1);
這行**中 &a 代表整個陣列的位址,(&a + 1) 就代表陣列a下乙個int型別數字的位址,把這個位址強轉成int*
賦給ptr。這裡(ptr - 1),指標減一就是減去它所指向的型別的大小,即往前移動四個位元組,所以 *(ptr - 1) = 5。
答案:2 和 52.
struct test
*p;
假設p 的值為0x100000。 如下表表示式的值分別為多少?
①p + 0x1= 0x___ ?
②(unsigned long)p + 0x1= 0x___ ?
③(unsigned int *)p + 0x1= 0x___ ?
解析:
①此處 p 是乙個結構體指標,p+1實際上是要加上p所指向的型別的大小,而p指向的這個結構體的大小是20位元組,所以第①題答案是:0x100014 (結構體大小計算詳解:部落格tianzez——記憶體對齊)
②把p強轉成 unsigned long 型別,那這裡就是乙個無符號長整型數字加1,所以結果是:0x100001。
③把p強轉成 unsigned int * 型別,此時p就是乙個指標,指標加一就是加上它所指向的型別的大小,無符號長整型資料的大小是4,所以這裡結果是:0x100004。
答案:①0x100014 ②0x100001 ③0x1000043.
int main()
; int
*ptr1 = (int
*)(&a + 1);
int*ptr2 = (int
*)((int)a + 1);
printf("%x, %x", ptr1[-1], *ptr2);
system("pause");
return
0;}
解析:① ptr1[-1] :int *ptr1 = (int *)(&a + 1);
這行**中 &a 代表整個陣列的位址,(&a + 1) 就代表陣列a下乙個int型別數字的位址,把這個位址強轉成 int * 賦給ptr,ptr 就指向尾元素a[3]下個元素的位址。ptr1[-1] 就相當於 *(ptr - 1)。所以最後結果是:0x000004。
② * ptr2:這裡最後結果是:0x2000000 或 0x100。詳解:部落格tianzez——指標 位址強轉的習題解析
答案:①0x000004 ②0x2000000 或 0x1004.
int main(int argc, char * argv)
; int
*p; p = a[0];
printf("%d\n", p[0]);
system("pause");
return
0;}
解析:這裡注意了,花括號裡面是圓括號,所以這裡就組成了逗號表示式。最後陣列裡面的值是 a[3][2] = ; 所以a[0] = 1。
答案:15.
int main()
解析:
這道題只要能把記憶體布局圖畫出來就很簡單了,做比較複雜的指標題時要學會畫記憶體圖,圖畫得越好,做題就更簡單。
答案:fffffffc 和 -46.
int main()
; int
*ptr1 = (int
*)(&aa + 1);
int*ptr2 = (int
*)(*(aa + 1));
printf("%d, %d", *(ptr1 - 1), *(ptr2 - 1));
system("pause");
return
0;}
解析:① * (ptr1 - 1):int *ptr1 = (int *)(&aa + 1);
這行**中 &aa 代表整個陣列的位址,(&aa + 1) 就代表陣列a下乙個int型別數字的位址,把這個位址強轉成 int * 賦給ptr,這個時候ptr就指向陣列 aa 尾元素 aa[2][5] 的下乙個元素。然後(ptr1 - 1),此時 ptr 就指向aa[2][5]。*(ptr1 - 1) = 10。
② *(ptr2 - 1):int *ptr2 = (int *)(*(aa + 1));
這行**裡 aa 代表陣列首元素位址,而我們通常解決這類問題時:
把乙個二維陣列看做乙個一維陣列,這個一維陣列的每個元素都是乙個一維陣列
那aa就代表二維陣列裡第一行的位址,(aa + 1)代表第二行的位址。* (aa + 1)表示整個第二行,而此時 (aa + 1) 做左值就表示第二行的位址,所以 (ptr2 - 1) = 5。
答案:①10 ②5
7.解釋下面**:
(1)(*( void(*) ()) 0)()
(2)void(*signal(int, void(*)(int)))(int);
解析:(1)
①void(*)()
是乙個函式指標型別,這個函式無引數,無返回值。
②(void(*)())0
把0強轉成函式指標型別,0是乙個函式的首位址。
③(*(void(*)())0)
解引用,把位址為0的函式取出來。
④(*(void(*)())0)()
呼叫這個位址為0的函式。
(2)
①對這塊**進行簡化:typedef void(* pfun_t)(int);
②pfun_t signal(int, pfun_t)
:定義了乙個函式指標 signal,指向的函式有兩個引數,型別分別是 int 和 pfun_t 。
8.
int main()
; char **pa = a;
pa++;
printf("%s\n", *pa);
system("pause");
return
0;}
解析:char **pa = a;
此時pa是乙個二級指標,pa++;
實際上是pa加上它所指向的元素型別的大小,而pa指向的是乙個 char * 型別指標,即pa = &a[0],pa++
之後,pa = &a[1]。所以*pa = a[1],最後輸出結果就是 「at」 。
答案: at9.
int main()
; char **cp = ;
char **
*cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
system("pause");
return
0;}
解析:請參照 :部落格wangye8613
答案:①piont ②er ③st ④ew
經典筆試題
1.關鍵字static的作用是什麼?在c語言中,關鍵字static有三個明顯的作用 1 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。2 在模組內 但在函式體外 乙個被宣告為靜態的變數可以被模組內所有函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。3 在模組內,...
iOS 陣列與指標經典筆試題
這個筆試題想必很多小夥伴都很面熟把,差不多10個人有7個人不會做這道筆試題,或許有知道答案的,但是僅僅知道答案,心裡還是一頭霧水。如果你真的不會那就請認真看完本文章學習一下吧!有的人認為nslog d arrayname 1 1 加1減1不就是抵消了麼,那肯定是訪問陣列首位址,那列印的值肯定是 10...
經典筆試題筆記
1.有無序的實數列v n 要求求裡面大小相鄰的實數的差的最大值,關鍵是要求線性空間和線性時間 方法 桶排序 由抽屜原理知最在差值maxsub有如下關係 所以,當所桶大小設為 然後就成有序的了,接下來就只要比較相鄰,取最優就可以了。2.13個球乙個天平,現知道只有乙個和其它的重量不同,問怎樣稱才能用三...