C已經放下很久了,大一學的基礎語言,之後學C++,學/用VC好長一段時間,直到大三 上Java畢設用Java,然後是直到4個月前一直用Java/J2EE的東西,現在又改用了C#。
呵呵,看起來學了不少語言。
雖說編程語言都是相通的,確實如此,先前學的為後來打下了基礎。但是,各門語言 到細處還是有很多不同的,現用現學吧。
現在又是找工作的時候了,論壇裡到處是筆經、面經、筆試題,等等,又忙起來了( 呵呵,不是我)
為什麼又想到C/C++了呢?因為被打擊了,下面這題(筆經中的)沒做對:
int main(int argc, char *argv[])
{
int a[]={1,2,3,4,5};
int* p=(int*)(&a+1);
cout << "a = " << *(a+1) << endl;
cout << "p = " << *(p-1)<< endl;
return 0;
}
答案是啥:
a = 2
p = 1
恭喜你,答錯了!
心裡哇涼哇涼的!!!
正確答案:
a = 2
p = 5
原因:
&a是數組指針,其類型為 int (*)[5];而指針加1要根據指針類型加上一定的值, 不同類型的指針+1之後增加的大小不同。a是長度為5的int數組指針,所以要加 5*sizeof(int),所以p實際是a[5]。但是p與(&a+1)類型是不一樣的(這點很重要)所 以p-1只會減去sizeof(int*)
注意:a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址 ,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個 對象的地址,即a[5].