今年找工作,发现算法岗是僧多肉少,基本面试都被问到关于c++的问题,长期以来一直关注算法更新,c++开发相关部分已丢弃脑后,几次面次碰壁之后,现决定重新稳固c++相关知识,如有错误,欢迎指导。还有疑问,string 是在常量区么?
1、c++内置类型(分为两组,基本类型和复合类型)
基本类型包括整数浮点数以及两者的多种变体
复合类型包括数组、字符串、指针、引用、结构体和共同体等
2、c++的基本整型:按照宽度递增,有char(1字节Byte)、short(2字节)、int(4字节)、long(32位4字节,64位8字节),且都有有符号和无符号版本
3、内存分区(很重要的一点,一般来说有5区):
1)堆区:由程序员手动分配和释放的,完全不同于数据结构中的堆,分类方式和链表差不多
c++里面分配合释放,注意要有[],不然只会删除p中的第一个元素,c语言是malloc和free配合使用
int *p = new int[20];
delete[]p;
2)栈区:由编译器自动分配和释放,如存放函数的参数值、局部变量等
3)全局(静态存储区):存放全局变量和静态变量,注意,包括DATA段(存放初始化全部变量和静态变量)和BSS段(存放未初始化的全局变量和静态变量,在BSS段,程序执行之前会自动清0)
4、文字常量区:常量字符串存放在这里,程序结束后,系统自动释放
5、程序代码区:存放函数体的二进制代码。
下面一段小程序可以简单帮组理解一下c++中的内存分区:
#include<iostream>
#include<string>
using namespace std;
int k = 1;//全局变量区
void main()
{
int i = 1;
char *j;
static int m = 1;//有static不管在哪里,都在静态变量区
string n = "hello";//string可以修改,应该是在栈区吧
char a[] = "hello";//位于栈上,有6个元素,含有字符串末尾的空字符
j = new char[2];//栈区
delete[]j;//及时释放
cout << "栈区地址: " << &i << endl;
cout << "堆区地址: " << &j << endl;
cout << "全部变量地址: " << &k << endl;
cout << "文字常量区还是栈区?我不懂: "<<&n << endl;
cout << "程序区地址: " << &main << endl;
system("pause");
}