題一:
int main()
; int *ptr=(int*)(&arr+1);
printf("%d %d",*(a+1),*(ptr-1));//執行結果:2 5
return 0;
}
考察知識點:1.陣列名為首元素的位址,給其進行+1操作其實就是指標向後走一步,也就是第二個元素的位址;
2.取位址陣列名(&arr)取到的是整個陣列的位址,雖然其指向的空間與陣列名相同,但其所代表的意義不同。例如:取位址陣列名+1,指標會走到陣列後邊的位置,因此對其進行-1操作,指標會走到陣列最後乙個元素的位置。
題二:
int main()
; int *ptr1=(int*)(&arr+1);
int *ptr2=(int*)((int)arr+1);
printf("%x,%x",ptr1[-1],*ptr2);//執行結果:4,2000000
return 0;
}
考察知識點:1.對指標使用下標來引用,相當於解引用操作。以上題為例相:(ptr1-1)=ptr[-1];
2.將陣列名也就是首元素位址強轉為int,在對其進行+1操作,相當於將指標向後移動了乙個位元組。然後再將其強轉為(int)的指標存放在ptr2這個指標中。而解引用操作會訪問四個位元組。
放到本題來理解就是,用int的四個位元組儲存了1的值,+1操作過後,指標走到了第二個位元組的位置。然後用ptr2來儲存這個位置。
具體請看下圖:
題三
int main()
; int *p;
p=a[0];
printf("%d",p[0]);//執行結果:1
return 0;
}
考察知識點:1,括號內的逗號表示式結果為最後乙個。在本題中(0,1)相當於1;
2.二維陣列的陣列名相當於第一行的位址。而陣列名後只帶乙個下標則代表第一行的某一列的元素。
題四
int main()
; int *ptr1=(int*)(&aa+1);
int *ptr2=(int*)(*(aa+1));
printf("%d,%d",*(ptr1-1),*(ptr2-1));//執行結果:10,5
return 0;
}
考察知識點參考題一題五
int main()
; char** cp=;
char*** cpp=cp;
printf("%s\n",**++cpp);//執行結果:point
printf("%s\n",*--*++cpp+3);//執行結果:er
printf("%s\n",*cpp[-2]+3);//執行結果:st
printf("%s\n",cpp[-1][-1]+1);//執行結果:ew
return 0;
}
考察知識點:1.自加或自減(++,–)操作執行後會改變變數本身的值;
下圖是對本體指標關係的乙個解析:
變數定義完畢後各指標的指向位置
第乙個printf執行時和執行後指標的指向位置
第二個printf執行時和執行後指標的指向位置
題六
int main()
; int* p=a;
printf("%d\n",*p++);//執行結果:1
printf("%d\n",*++p);//執行結果:3
return 0;
}
考察知識點:1.後置的++雖然也可以改變指標的位置,但其返回值不會發生改變。
2.前置的++既改變了指標的位置也改變了其返回值。
因為1,所以在解引用之後列印的仍然是1,但第乙個printf語句執行結束之後,指標p已經指向了2的位置。
因為2,所以指標會先指向3然後在解引用列印。
幾個有意思的面試題
1,abcdx9 dcba 因為9乘a不進製所以a只能是1 9乘d得個位是1所以d只能是9 同樣9乘b也不能進製只有1和0,1已屬a所以b只能是0 9乘9進8要想第二位為0,乘9的個位上必須是2,c就只有8了 所以abcd 1089 2,一艘輪船從甲港順水航行到乙港,立即逆水返回甲港。共用8小時。已...
有意思的面試題
1.10個箱子,每個箱子10個蘋果,其中乙個箱子的蘋果是9兩 個,其他的都是1斤 個。要求利用乙個秤,只秤一次,找出那個裝9兩 個的箱子。1,他們都是很聰明的人 2,他們的原則是先求保命,再去多殺人 3,100顆不必都分完 4,若有重複的情況,則也算最大或最小,一併處死 3.現在北京有一套房子,20...
說幾道有意思的面試題
很長時間沒有寫部落格,突然想起來現在的公司的面試題。選了比較有意思的幾道題,寫一篇部落格談一談。祖傳 的重構 題目描述 現在有乙個函式add 裡面 很複雜實現了一系列的功能。不能不去重構他會波及太大,所以不能改函式裡面的 但新需求是要知道在 呼叫了這個函式,這個函式被呼叫了多少次 count 和被例...