码迷,mamicode.com
首页 > 编程语言 > 详细

C++笔记--指针和引用

时间:2016-05-26 18:44:59      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

  • 面试一:指针与引用的区别?

    答案:

    • (1)非空区别。在任何情况下都不能使用指向空值的引用。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高。

      (2)合法性区别。在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

      (3)可修改区别。指针与引用的另一个重要的区别是指针可以被重新赋值以指向另一个不同对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。


  • 面试题二:下面5个函数哪个能成功进行两个数的交换?

#include<iostream>
using namespace std; 
void swap1(int p,int q)
{
    int temp;
    temp=p;
    p=q;
    q=temp;
}
void swap2(int *p,int *q)
{
   int *temp;
    *temp=*p;
    *p=*q;
    *q=*temp;
}
void swap3(int *p,int *q)
{
    int *temp;
    temp=p;
    p=q;
    q=temp;
}
void swap4(int *p,int *q)
{
    int temp;
    temp=*p;
    *p=*q;
    *q=temp;
} 
void swap5(int &p,int &q)
{
    int temp;
    temp=p;
    p=q;
    q=temp;
}
int main ()
{
    int a=1,b=2;
    //swap1(a,b);
    //swap2(&a,&b);
    //swap3(&a,&b);
    //swap4(&a,&b);
    //swap5(a,b);
    cout << "a:"<< a <<endl;
    cout << "b:"<< b <<endl;
    return 0;
}


解析:
这道题考察的是参数传递、值传递、指针传递(地址传递)和引用传递。

     swap1传递的是值的副本,在函数中只是修改了形参p、q(实际是a、b的一个拷贝),p、q的值确实交换了,但是它们是局部变量,不会影响到主函数a和 b 。当函数swap1生命周期结束时,p、q所在的栈也就被删除了。

     swap2传递的是一个地址进去,在函数体内的形参*p、*q是指向实际的参数a、b地址的两个指针。

     这里要注意:

             int *temp;

             *temp=*p;

     是不符合逻辑的,int *temp新建了一个指针(但是没分配内存)。*temp=*p不是指向而是拷贝。把*p所指向的内存的值(也就是a 的值)拷贝到*temp所指向内存里了。但是int *temp不是不分配内存吗?的确不分配,于是系统在拷贝时临时给了一个随机地址,让它存值。分配的随机地址是个“意外”,且函数结束后不回收,造成内存泄漏。

     swap3传递的是一个地址,在函数体内的参数*p、*q是指向实际参数a、b地址的两个指针。

     这里要注意:

             int *temp;

             temp=p;

     int *temp新建了一个指针(但是没分配内存)。temp=p是指向而不是拷贝。temp指向了*p所指向的地址(也就是a )。而代码:

             int *temp;

             q=temp;

     但是函数swap3不能实现两数的交换,这是因为函数体内只是指针的变化,而对地址中的值却没有变化。

     swap4可以实现两数的交换,因为它修改的是指针所指向地址中的值。

     swap5函数与swap4相似,是一个引用传递,修改的结果直接影响实参。
答案:
  swap3,swap5


 

  • 面试题三:下面这个程序测试会有什么结果?

    #include<iostream>
    using namespace std;
    void GetMemory(char *p,int num)
    {
        p=(char *)malloc(sizeof(char) * num);
    }
    int main ()
    {
        char *str = NULL;
        GetMemory(str,100);
        strcpy(str,"hello");
        return 0;
    }

    解析:毛病出在函数GetMemory中,编译器总是要为函数的每个参数制作临时副本,在本例中,void GetMemory(char *p , int num)中的*p实际上是主函数中str的一个副本,而在函数GetMemory中只是把p所指向的内存地址改变了,但是str丝毫未变,因为函数GetMemory没有返回值,因此str并不指向p所申请的那段内存,所以函数GetMemory并不能输出任何东西,如下图所示。事实上,每次执行一次GetMemory就会申请一块内存,但是申请的内存却不能有效释放,结果是内存一直被独占,最终造成内存泄露。

    技术分享

C++笔记--指针和引用

标签:

原文地址:http://www.cnblogs.com/Kobe10/p/5532063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!