1、腾讯笔试题
有如下C++代码:
struct A{
void foo(){printf("foo");}
virtual void bar(){printf("bar");}
A(){bar();}
};
struct B:A{
void foo(){printf("b_foo");}
void bar(){printf("b_bar");}
};
那么
A *p=new B;
p->foo();
p->bar();
输出为:
【答案】 barfoob_bar
请找出下面程序中有哪些错误:
int main()
{
int i=10;
int j=1;
const int *p1;//(1)
int const *p2=&i; //(2)
p2=&j;//(3)
int *const p3=&i;//(4)
*p3=20;//(5)
*p2=30;//(6)
p3=&j;//(7)
return 0;
}
【答案】6,7错误
const int *p1; p1可变,*p1不可变
int const *p2=&j p2可变,*p2不可变
int *const p3=&i; p3不可变,*p3可变
以下代码输出什么____.
main()
{
int a[5]={1,2,3,4,5};
int *p=(int *)(&a+1);
printf("%d",*(p-1));
}
【答案】5
&a a是一个数组名,也就是数组的首地址。 对a进行取地址运算符,得到的是一个指向数组的指针!!也就相当于 int (p) [5] = &a; p是一个指针,它指向的是一个包含5个int元素的数组!! 那么执行p+1后,p的偏移量相当于 p + sizeof(int) 5 !! 而程序中强制将指针p转换成一个int* 那么 p -1 其实就是 p - sizeof(int) 所以,p -1 指向了数组中得最后一个元素,也就是 5