經典筆試題 指標詳解

2021-08-10 23:38:16 字數 4477 閱讀 7580

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個球乙個天平,現知道只有乙個和其它的重量不同,問怎樣稱才能用三...