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)
}  //结构体的首地址偏移量是结构体中最大偏移量的倍数就可以了

 

posted @ 2017-02-16 14:03  acliang  阅读(85)  评论(0编辑  收藏  举报