副本机制
lambda不能取地址,无法当作函数指针
[1](2){3}(4)匿名lambda
1捕获列表 =只读 2后加mutable就可以修改副本
&读写 全部改变
对部分进行操作是,直接在[]放变量,用&代表读写,只写变量名只可读
=只能用于全部
想不只是改变副本,就加&,进行完全修改
const在C中是伪常量,防止直接,但是间接可以修改,通过地址改变
const在C++编译器自动优化替换,除了被赋予变量,编译器就不敢瞎修改变量的
const数组没有优化可以间接修改
指向常量的指针不能被修改,转一下(int*)
变量const 编译器无法优化
常量const 直接被优化,读取的时候直接在寄存器里面读,so常量的是不会改变的
在指针引用时 在2013 要括号 int(**(&po))=ptr &和*都要()
左值引用只能搞对象
右值引用可以直接是常量 右值引用为了快速备份寄存器在内存中备份,而且在不需要时,被自动释放
左值引用完全为变量的别名
右值引用完全代替常量的别名
函数返回值有副本机制,返回变量
栈区,自动回收,释放,返回值为指针,不能指向栈区,返回引用,不可引用栈区
指针在栈区,指针指向内存在其他区域
只要使用引用,直接把变量名pb改成(&pb)就可以了
引用数组是非法的...
对引用来说必须是对齐的,不存在大到小的转换
数组名右边是大小,左边是类型
#include<iostream>
using namespace std;
void main()
{
int i = 10;
int *p = &i;
int **pp = &p;
int**&ppp = pp;
int a[4]{1, 2, 3, 4};
int *p[4]{a, a + 1, a + 2, a + 3};
//int(*p1)[4](new int*[4]);
int*p1=new int[4]{1, 2, 3, 4};
cout << p1 << endl;
int(*p)[2] = (new int[3][2]{{ 1, 2 }, { 3, 4 }, { 5, 6 }});
int(*&rp)[2] = p;
for (int m = 0; m < 3;m++)
{
for (int n = 0; n < 2; n++)
cout << rp[n][m];
cout << endl;
}
int(*p)[4] {new int[3][4]{{ 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }}};
int *p2(new int(5));
const int * s = p2;
const int a[3]{1, 2, 3};