IBM笔试题目之C++技术题目


c++中引用和指针有什么不同?指针加上什么限制等于引用?



引用是在变量表中增加该变量的别名,不占用内存空间,一经确定不能修改但指针要在内存中分配空间。把指针定义为const可做引用使用,但有本质的区别。




首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。



因为引用肯定会指向一个对象,在C++里,引用应被初始化。指针没有这样的限制。



不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。









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



总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。



还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。





怎样用最快的方法判断链表是否有环?






定义两个指针,一前一后,同时移动,前面的移动比后面的慢,如果是循环的则后面的肯定会追上前面的



bool anyCircleInList(LNode* pHead)

{

//无节点或只有一个节点并且无自环

if(pHead == NULL pHead->next == NULL)

return (false);

//自环

if(pHead->next == pHead)

return (true);

LNode *pTemp1 = pHead;

//step 1

LNode *pTemp = pHead->next;

//step 2

while(pTemp != pTemp1 && pTemp != NULL && pTemp->next
!= NULL)

{

pTemp1 = pTemp1->next;

pTemp = pTemp->next->next;

}

if(pTemp == pTemp1)

return (true);

return (false);

}

没有评论: