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<<p<<" "<<*p<<endl;
}

int main(void)
{
    int *p=NULL;
    test(p);
    if(p==NULL)
    cout<<"指针p为NULL"<<endl;
    return 0;
}
//运行结果为:
//0x22ff44 1
//指针p为NULL
// 因此表明了。在函数内部修改指针的指向并不会影响原指针的指向。

void test2(int& p)
{
    int a = 1;
    p = a;
}

int main(void)
{
    int a = 10;
    int& ya = a;

    test2(ya);
    cout << ya << endl;

    return 0;
}

// 输出结果为1.

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

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

4 堆和栈的区别。

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

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;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值