2017.2.16
一.面试题:
1.int(*z(int x,int (*y)(int)))(int)
令Y=int (*y)(int)
Y z(int x,Y)
2.int( *& z( int (*&y) (int,int)))(int,int)
令Y1=int(*& )(int,int)
Y1 z(Y1)
二.引用高级
1. 二维数组的引用
1 int a[2][5]={0} 2 int (&ra)[2][5](a);
2.函数指针的引用(用途等于指向函数指针的指针)
1 int (*p)(int a,int b)(函数名); 2 int (*&rp)(int a,int b)(p);
3 int (* const &rp)(int a,int b)(p)
3.引用数组是非法的,使用指针数组。
1 int a=0,b=1,c=2; 2 int &p[4]={a,b,c}; //error 3 int *pp[4]={&a,&b,&c); //ac
4.sizeof(引用)
在64位编译器中,指针是占8个字节的,引用的本质是指针,在类中退化时也是8字节。
初始化后,sizeof(x的引用)=sizeof(x)
//x64编译器
1 struct node1 2 { 3 char &a; 4 short &b; 5 }; 6 7 int main() 8 { 9 double b = 9.0; 10 double &c = b; 11 std::cout << sizeof(c) << std::endl; //8 12 std::cout << sizeof(node1) << std::endl; //16 13 std::cin.get(); 14 }
5.右值引用
节约内存拷贝,直接在寄存器修改。
左值转右值方法: std::move()
6.常量引用:不能用常量引用修改。
7.引用可以给另一个引用初始化。
三.结构体对齐
两个原则:1.相对于结构体首地址的偏移量必须是自身对齐参数和#pragma pack()的最小值的倍数
2.结构体的总长度必须是自身对齐参数和#pragma pack()的最小值的倍数
eg1:
#pragma pack(4) #include<stdio.h> #include<iostream> struct node { int i; double d; } q; int main() { std::cout<<sizeof(q)<<std::endl; //q=12 如果#pragma pack(4)不写 ,64位操作系统默认#pragma pack(8),q=16
}
eg2:
#include<stdio.h> #include<iostream> struct node1 { int a; char b; short c; }p; struct node2 { bool a; node1 p; double b; int c; }q; int main() { std::cout<<sizeof(p)<<std::endl;//8 内存分布为 4 1(1) 2(2) std::cout<<sizeof(q)<<std::endl;//32 内存分布为 1 (3) 8 (4) 8 4 (4) } //结构体的首地址偏移量是结构体中最大偏移量的倍数就可以了