C++面试速成1

  1. 在main函数之前先后指向的代码可能是什么呢?

main函数之前:

  • 设置栈指针

  • 初始化静态变量全局变量

  • 将未初始化部分的全局变量赋初值。例如short,int,long=0;

  • 全局对象初始化,在main之前调用构造函数,这是可能会执行前的一些代码

  • 将main函数的参数argc,argv等传递给main函数,然后才真正运行main函数

  • __attribute__((constructor))

main函数之后

  • 全局对象的析构函数会在main函数之后执行;

  • 可以用 atexit 注册一个函数,它会在main 之后执行;

  • __attribute__((destructor))

2 指针和引用的区别:

  • 指针是一个变量,存储的是一个地址,引用跟原来的变量实质上式一个东西,是原变量的别名。

  • 指针可以有多级,引用只有一级

  • 指针可以为nullptr,引用不能为nullptr且定义时必须初始化。

  • sizeof指针得到本指针的大小,sizeof引用得到所指向变量的大小。

  • 当把指针作为参数传递时,也是将实参的一个拷贝传递给形参,两者地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参,而引用可以。(!!!)

  • 引用本质是一个常指针,同样会占用四字节,指针是具体的变量,需要占用存储空间。

  • 引用一旦初始化之后就不可以改变了。不存在指向空的引用。

针对第四条测试代码:

int a = 10;
    int& ya = a;
    int* pa = &a;
    char b = 'a';
    char& yb = b;
    cout << "a的大小为" << sizeof(a) << endl;
    cout << "a的引用大小为" << sizeof(ya) << endl;
    cout << "a的指针大小为" << sizeof(pa) << endl;
    cout << "b的大小为" << sizeof(b) << endl;
    cout << "b的引用大小为" << sizeof(yb) << endl;

针对第五条测试:

void test(int *p)
{
  int a=1;
  p=&a;
  cout<

3 什么时候用指针,什么时候用引用呢?

引用能解决问题的就首选引用,否则用指针

4 堆和栈的区别。

栈空间默认4M,堆区一般是1G-4G,而且空间存储不连续。

C++面试速成1_第1张图片

5 既然有了malloc/free,c++中为什么还需要new/delete呢?

malloc/free和new/delete都是用来申请内存和回收内存的。在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free,所以new/delete是必不可少的。

6 strlen和sizeof区别?

  • sizeof是运算符,并不是函数,结果在编译时得到而非运行时。strlen是函数。

  • 因为sizeof值在编译时确定,所以不能用来得到运行时分配存储空间的大小。

7常量指针和指针常量。

常量指针:指针指向的内容一旦确定后便不能改变,但是指向地址中存储的值可以改变。

一般可以这样理解:const 在 * 之后, 例如int * const p;

指针常量:指针指向的一旦确定后,地址中存储的值就不能改变了。但是指向可以改变。

一般可以这样理解 const 在 * 之前。例如 const int *p;

ps:常量指针就是引用。

代码展示:

// 常量指针: 指向则不能改变了,但是可以改变值。
    int a = 10;
    int b = 12;
    int* const p = &a;
    cout << *p << endl;
    // 这里会报错,编译就过不去。
    //p = &b;



    // 指针常量:引用关系可以改变,但是被引用对象的值不能改变。
    int a = 10;
    int b = 12;
    const int* p = &a;
    cout << *p << endl;
    p = &b;
    cout << *p << endl;

    //这里会报错,编译过不去。
    //*p = 100;

你可能感兴趣的:(C++,c++,开发语言)