范围for语句,提升遍历效率
范围for语句,提升遍历效率
原本的遍历用法
int v[] = { 1,2,3,4,5,6,7,8,9,10 };
for (auto x : v)
{
cout << x << endl;
}
上面这个遍历方法,实际上执行了拷贝过程,他要将v数组里面的每个项拷贝到x中,然后输出x的值
怎么解决这个问题呢?引用
下面这个就没有执行拷贝,而是输出的v自己地址上的值
for (auto& x : v)
{
cout << x << endl;
}
动态内存分配问题
C++中详细分配了五个区域
- 1、栈:一般函数内部的局部变量都会存放在这里,由编译器自动分配的释放
- 2、堆:程序员malloc/new分配,用free/delete来释放,系统结束前不会自动释放
- 3、全局/静态存储区:放全局变量和静态变量,程序结束时自动释放
- 4、常量存储区
- 5、程序代码区
堆和栈的区别
栈:空间有限,由系统分配,速度快,程序员无法控制
堆:只要不超过实际物理内存,也在操作系统允许的范围内,都可以给你分配,但是速度慢,可以随时用,可以分配十分巨大的内存
malloc(memmory alloction)/new来分配,不适用的时候要用free/delete来销毁
void *alloc(int byteSize)参数:字节长度,申请成功,返回头指针,失败返回NULL
void *返回的是可以强制转换为任何指针的类型
test1
int* p = NULL;
p = (int*)malloc(sizeof(int));
*p = 12;
cout << *p << endl;
free(p);//千万记得,不用的时候free
test2
char* p2 = NULL;
p2 = (char*)malloc(100 * sizeof(char));
if (p2)
{
strcpy_s(p2, 100, "hello world , william_x_f_wang");
cout << p2 << endl;
free(p2);
}
test3
int* p3 = (int*)malloc(100 * sizeof(int));
if (p3)
{
int* q = p3;
//notice this format,this funny
*q++ = 66;
*q++ = 99;
cout << *p3 << endl;
cout << *(p3 + 1) << endl;
free(p3);
}
但是C++中就是要用new/delete来分配内存,不能用malloc/free,那是c的
指针变量名 = new 类型标识符
指针变量名 = new 类型标识符(初始值)
指针变量名 = new 类型标识符[内存单元个数]
int* p4 = new int;
if (p4)
{
*p4 = 123;
cout << *p4 << endl;
delete p4;//new出来的,千万不要忘记delete
}
int* p5 = new int(321);
if (p5)
{
cout << *p5 << endl;
delete p5;
}
int* p6 = new int[8];
if (p6)
{
*p6 = 1234;
*(p6 + 1) = 4321;
cout << *(p6) << endl;
cout << *(p6 + 1) << endl;
delete[] p6;
}
nullpter
nullpter,避免整数和指针之间发生混合,因为NULL==0
int a = nullpter就会出错
函数重载的是很可能会有用
NULL和nullptr是不同的类型
cout << typeid(NULL).name() << endl;
cout << typeid(nullptr).name() << endl;