程序员面试之指针和应用(三)

来源:互联网 发布:零基础学云计算 编辑:程序博客网 时间:2024/05/14 04:28

1、指针和引用的区别

        引用相当于一个变量的别名,或者通俗的说就是一个变量的“外号”,如果没有定义好的变量,那就没有相应的“外号”,于是指针和引用可以从以下几个方面区分,

        (1) 非空性:引用在定义时必须赋值,而指针定义是可以赋值可以不赋值。

        (2) 合法性测试:函数调用中,传递引用时,不需要进行合法性检验,而传递指针时,要进行合法性检验,防止传递空指针。

        (3) 可修改性:引用相当于一个变量的“外号”,一旦确定,不可改变,而指针可以随意改变。

        (4) 应用却别:在函数调用过程中,若传递的变量或者对象地址不会发生变化,则选择传递应用要优于传递指针,否则必须传递指针。

2、指针需要赋予合理的地址后才可以使用

int *ptr;*ptr = 25; //未给指针赋初始值,程序崩溃int *ptr = 0x8000;*ptr = 25; //随意的给指针赋初始值,较危险

3、函数指针

        (1) 函数指针:void (*f)()

        (2) 函数返回值指针:void* f()

        (3) const指针:const int*

        (4) 指向const的指针:int * const 

        (5) 指向const的const指针:const int * const 

        (6) double*  (*gh)[10],gh是指向一个一维数组的指针,数组中的元素都是 doublue*型。

        (7) double (*f[10])(),f是一个数组,f有10个元素,元素都是函数指针,指针指向的函数类型都是没有参数且返回值为double的函数。

        (8) Long (*fun)(int),fun是函数指针,指向的函数类型为参数为int型,返回值为long型。

        (9) int (*(*F)(int,int))(int),F是一个函数指针,指向的函数类型为,参数为int,int,返回值为函数指针,返回的函数指针,参数为int,返回类型也为int。

4、指针数组和数组指针

        (1) int (*a)[10],数组指针,指向元素为int型,且包含10个元素的数组。

        (2) int *a[10],  指针数组,相当于存储了10个int*型的指针。

5、C++中有了malloc/free,为什么还需要new/delete

        malloc/free 是C++/C中的库函数,而new/delete是C++中的操作符,二者都用于内存的分配。但对已非内置数据类型,malloc/free无法满足动态对象的要求,对象在创建时要自动调用构造函数,对象在消亡前要自动调用析构函数。由于mallo/free是库函数,无法将调用构造函数和析构函数的任务强加给malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的new操作,以及能完成清理与释放内存的delet操作。

6、智能指针

        C++中智能指针的引入,主要是为了防止内存泄露。其原理就是通过创建一个对象来管理内存资源,每个对象申请完内存后,将返回的地址传递给智能指针,程序员不需要在担心内存不能被即使释放的问题,智能指针会帮助你在适当的时候完成内存的释放。

        auto_ptr:现在使用的较少,它的特点是,当auto_ptr被拷贝时,原来的那一份会被删除。

7、this指针

        this指针时时刻刻指向实例本身。

        (1) this指针本质是一个函数参数,只是被编译器隐藏起来了,全局函数和静态函数不能使用this指针,只有成员函数可以使用。

        (2) this指针在成员函数开始之前被构造,在函数结束后被清除,this指针的生命周期与普通的函数参数一样。当调用一个类的成员函数时,编译器会将this指针作为函数的参数传递进去。由下例可知,this是一个常指针,是不能被修改的。

A a;a.func(10);//等于 a.func(&a,10)
在编译器看来,func函数的原型是: int func(A* const this, int p)
        (3) this指针不占用对象的空间,只会占用参数传递时的空间,或者直接占用一个寄存器。

0 0