C語言陣列和指標的問題一道非常值得深思的筆試題

2022-09-28 18:03:15 字數 1302 閱讀 1490

最近筆試就遇到下面這道題,誰都不敢說自己的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 需要注意函式的值傳遞,形參用完後會自動釋放,對實參沒有影響。但用指標把位址所指向的值改變就不一樣了 值傳遞好比...