20.简述数组与指针的区别?
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。
(1)修改内容上的差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误,运行时错误
(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是100 字节
}
21题: int (*s[10])(int) 表示的是什么?
int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。
22题:栈内存与文字常量区
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;//0 分别指向各自的栈内存
cout << ( str3 == str4 ) << endl;//0 分别指向各自的栈内存
cout << ( str5 == str6 ) << endl;//1指向文字常量区地址相同
cout << ( str7 == str8 ) << endl;//1指向文字常量区地址相同
结果是:0 0 1 1
解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。
-
C++中的虚函数和纯虚函数有何区别?
- 虚函数(Virtual Function)是在基类中声明的、可以在派生类中重新定义的函数。在运行时可以根据对象的实际类型来调用适当的函数。
- 纯虚函数(Pure Virtual Function)是在基类中声明的没有实际定义的虚函数,通过在函数声明时添加“= 0”来表示。包含纯虚函数的基类称为抽象类,不能直接创建对象,只能作为基类派生出其他类使用。
-
C++中的多态性(Polymorphism)是什么?
- 多态性是面向对象编程的一个重要概念,指的是在运行时根据对象的实际类型来选择合适的函数实现。
- C++中实现多态性的关键是通过虚函数和基类指针或引用来实现。通过基类指针或引用可以指向派生类的对象,并调用相应的虚函数。