谁能给我解释下下面2题

来源:百度知道 编辑:UC知道 时间:2024/05/25 13:57:18
1、
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
char *src="hello,world";
char *dest=NULL;
char *d,*s;
int len;
len=strlen(src);
dest=(char *)malloc(len);
d=dest;
s=&src[len-1];
while (len--!=0)
*d++=*s--;
*d='\0';
printf("%s",dest);
}

为什么while后面要用“d”而不是用“dest”,为什么用“dest”会出错?他们不是同一个玩意么?

2、解释一下下面的程序的输出是为什么?
class Base{
public:
int f1(){return 1;}
virtual int f2(){return 2;}
};
class Derived:public Base{
public:
int f1(){return 3;}
virtual int f2(){return 4;}
};
void main(){
Base b;
Derived d;
Base *bp;
Derived *dp;
bp=&d;

cout<<bp->f1();
cout<<bp->f2();
dp=(Derived*)&b;
cout<<dp->f1();
cout<<dp->f2();}

1.
while (len--!=0)
*d++=*s--;
因为在while循环中,d++是要不断自增的,如此达到反序赋值的目的,如果人使用dest的话,那么dest不断往移,最终指向内存尾,此时你再输出,结果必须为空.如下:
while (len--!=0)
*dest++=*s--;
*dest='\0'; //无论dest移到哪,dest字符赋值为0,所以最后输出的必然为空.

2.
输出结果应该为:1432
Derived d;
Base *bp;
bp=&d;
cout<<bp->f1();
bp是Base指针,而f1不是虚函数,所以在调用时搜索本身的f1()函数(如果Base没有f1()函数,必然出错),输出1.

cout<<bp->f2();
bp虽然是Base指针,但是f2()是虚函数,所以调用的是实际对象的f2()函数,而bp此时指向的是d,即Derived实例,所以调用的Derived::f2(),输出4

dp=(Derived*)&b;
cout<<dp->f1();
同第一个,f1非虚函数,搜索调用者的f1()函数,发现Derived类有f1()函数,即调用之,输出3.这里实际上是覆盖了Base::f1().

cout<<dp->f2();
同第二个,f2是虚函数,所以调用实际对象的f2(),dp指向的实际上是Base实例b,所以调用的是Base::f2(),输出2.

最终结果即为:1432

好难

为什么while后面要用“d”而不是用“dest”,为什么用“dest”会出错?他们不是同一个玩意么?

dest 指向新分配内存的开始位置,如果dest变了,最后使用的dest就是指向分配内存的末尾了

1.

“d”和“dest”是同一个玩意,
但是如果直接使用dest++的话,