再忆起C/C++
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].