错题记录

1.字符串

C语言
char *p1 =123, *p2 = ”ABC”, str[50] = “xyz”;
strcpy(str + 2, strcat(p1, p2));
printf(%s\n”, str);


xyz123ABC
z123ABC
xy123ABC
出错

正确答案:出错
p1、p2都是常量指针,虽然在C语言char *p1 = "123"没有强调标识,在C++这里必须加上const否则会报错const char *p1 = "123",常量指针,只能改变p1的指向,不能改变p1指向的内容,也就是字符串常量”123“
同样以虚拟内存来理解:”123“属于字符串常量,位于常量区,该区域内容不能修改,也自然不能使用指针来修改。
2.C++虚函数内存指针分布

class ClassA
{
public:
    virtual ~ ClassA(){};
    virtual void FunctionA(){};
};
class ClassB
{
public:
   virtual void FunctionB(){};
};
class ClassC : public ClassA,public ClassB
{
    public:
};
  
ClassC aObject;
ClassA* pA=&aObject;
ClassB* pB=&aObject;
ClassC* pC=&aObject;

关于pA,pB,pC的取值,下面的描述中正确的是:

pA,pB,pC的取值相同.
pC=pA+pB
pA和pB不相同
pC不等于pA也不等于pB

正确答案:pA和pB不相同
假设ClassA的内存地址块是1,ClassB的内存地址块是2,则ClassC的内存包含了1和2,
而取地址操作通常指的是取首地址,即pA指向ClassA的首地址,
pB就指向了ClassB的首地址,由于ClassC采用的是多继承的方式,
根据继承顺序在继承ClassB后,pC指向的首地址与pA一样。
3.字节对齐
在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?
正确答案: 1
C++对空类或者空结构体 ,对其sizeof操作时候,默认都是 1个字节。
类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为1,而不是0。
4.指针

#include 
 
void GetMemeory(char *p)
{
    p = (char *)malloc(100);
}
void Test()
{
    char *str = NULL;
    GetMemeory(str);
    strcpy(str, "Thunder");
    strcat(str + 2, "Downloader");
    printf(str);
}
请问运行Test函数结果是:

Thunder Downloader
under Downloader
Thunderownloader
程序崩溃

str是char *类型,str指向NULL,str的值为0,str作为实参传入函数GetMemory,形参p = str = 0,
对p动态分配内存并不会改变到str,这里传参并没有涉及str的址传递,只是简单的值传递。后面的指令对没有内存空间的str进行赋值操作会导致程序崩溃。

5.形参

下列关于C语言的函数参数说法不正确的是__________()
实参可以是常量,变量或表达式
形参可以是常量,变量或表达式
在函数定义时必须指定形参的类型
形参与实参的类型应相同或赋值兼容

正确答案:形参可以是常量、变量或者表达式。
实参可以是常量、变量或表达式,但是形参只能是变量。
实参(argument):
全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。
形参(parameter):
全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。

6.按位与&的妙用

int func(int x)
{
    int countx = 0;
    while(x)
    {
        countx++;
        x = x&(x-1);
    }
    return countx;
} 

假定x = 9999,求函数func的返回值?


x = 10011100001111
答案: 8

每执行一次x &= (x - 1)就会使x的二进制表示最低位的1变成0,效果就是统计x二进制表示中1的个数。
在剑指offer中也涉及到这个思想的题目二进制中1的个数和个人理解

7.抽象类

假设Aclass为抽象类,下列正确的说明语句是( )。

Aclass fun( int );
Aclass *p;
int fun( Aclass );
Aclass Obj;

正确答案:Aclass *p;
抽象类不能被实例化,但抽象类指针可以指向继承类的对象。

你可能感兴趣的:(C++,C)