最近筆試就遇到下面這道題,誰都不敢說自己的c/c++能有多精通,當然,工作一久,很多**病也就容易犯了,所以說,理論是真的很重要的,下面這道題,說實話還是挺基礎的,雖然當時筆試被我給猜對了,但還是要深究一下具體的轉換細節。
如題:#include
int main(void)
; char *t ;
t = (str+4)[-1];
printf("%s\n",t);
return 0 ;
}請問以上程式輸出結果?程式正確執行結果如下:
我當時一看,陣列下標還有負值?這是怎麼一回事?我們把上面這個程式變一下,就很清晰了,如下:
#inclu程式設計客棧de
int main(void)
; char *t ;
// t = (str+4)[-1];
// printf("%s\n",t);
t = (str+4)[0] ;
printf("t:%s\n",t);
return 0 ;
}這個程式毫無疑問,答案就是ij。
看上面這幅圖即可得到結果,其實就是這麼乙個轉換關係:
實際上編譯系統將陣列元素的形式a[i]轉換成*(a+i),然後才進行運算。對於一般陣列元素的形式: 陣列名》[下標表示式》] 編譯程式將其轉換成:*(陣列名》+下標表示式》),其中下標表示式為:下標表示式*擴大因子。整個式子計算結果是乙個記憶體位址,最後的結果為:*位址》=位址所對應單元的位址的內容》。由此可見,c語言對陣列的處理,實際上是轉換成指標位址的運算。
所以,上面的式子的轉換結果就是:t = *(str+4);
所以,t = (str+4)[-1] *****==> t = *(str+4-1) *****=> t = *(str+3) ;
所以:#include
int main(void)
; char *t ;
// t = (str+4)[程式設計客棧-1];
// printf("%s\n",t);
t = *(str+4-1);
printf("t:%s\n",t);
return 0 ;
}執行結果:
如果換種寫法,如:
#include
int main(void)
; int *p = &a[0] ;
b = (p+8)[-4];
printf("b:%d\n",b);
return 0 ;
}你能知道答案是多少嗎?一樣的運算法則:
再接再勵!!溫故而知新,注重基礎,一點細節也不要放過!
總結
一道C語言的問題 II
fj haozi description haozi很淘氣,最近fj帶了很多好吃的,haozi乘fj不在的時候就吃了很多好吃的,fj回來發現了,決定一定要抓住haozi。但是haozi很聰明,假設原來他在16號樓,那麼下一分鐘必定是在15號樓或者17號樓.如果他一開始在1號樓,那麼下一分鐘只能在2號...
關於C陣列指標的一道面試題
本文由 lonelyrains c語言指標是經典問題了,還是做錯啊 int main int p int a 1 a陣列的位址加1,是以a陣列的大小為乙個單位 char pc1 char a 1 同上,只是pc1變成了字元指標,下次pc1加減運算是乙個位元組大小為乙個單位 char pc2 char...
一道C語言函式值傳遞問題
此題,不仔細想想,很容易答錯哦 include includevoid fun int a,int b,int c void fun int a,int b,int c void main 需要注意函式的值傳遞,形參用完後會自動釋放,對實參沒有影響。但用指標把位址所指向的值改變就不一樣了 值傳遞好比...