2013-10-21 88 views
1

以下代码中是否有指针或返回指针调用的区别? 我只是试图修改我的结构并获取resutl。
唯恐说我有一个结构。指针调用和返回指针之间的区别

struct Address 
{ 
    const char* name; // "Jim Dandy" 
    int number; // 61 
}; 

Address* Modifying2(Address* adr) 
{ 
    adr->name="Long John2"; 
    return adr; 
} 
//or 
void Modifying3(Address* adr) 
{ 
    adr->name="Long2 John2"; 
// return adr; no return 
} 
void print_addr2(const Address& r) 
{ 
    cout << r.name << '\n' 
    << r.number << ' ' << r.street << '\n'; 
} 
int main() 
{ 
    Address jd = 
    { 
    "Jim Dandy", 
    61 
    }; 

    Address* jdPtr=&jd; 
    Modifying3(jdPtr); 
    print_addr(jdPtr); 
    //or 
    print_addr(Modifying2(jdPtr)); 

    return 0; 
} 

结果是一样的,但哪一个更安全?我的意思是明确的?

+0

看起来它应该做同样的事情。 – foobar123foofoo

+0

请不要使用指针,只使用智能指针和用户友好的包装,如std :: string和std :: vector。不要浪费你的时间,“什么指针不是UB?” – stefan

+2

除了显而易见的是一个函数返回一个值而另一个函数没有返回值,这些函数之间没有真正的区别。我不会认为比另一个更“安全”或更“明确”。 –

回答

1

两种方法都在做同样的事情。返回指针并不重要。

但最安全的方法是通过引用传递值。 (你没有这样实现)。这里如何做到这一点

void Modifying4(Address &adr) 
{ 
    adr.name="Long2 John2"; 
} 
+0

很好的建议。没有必要永远传递'nullptr',那为什么要允许它呢? – MSalters

+0

@MSalters你的意思是? –

+0

@DonCarleone:'T&'和'T *'参数的主要区别是'T *'参数将接受一个指向对象或'nullptr'的指针,而'T&'只接受对一个东西。这意味着接受'T *'的函数应该检查它是否有'nullptr'。例外:智能指针类的内部,通常采用迭代器的算法重载。 – MSalters

0

没有真正的区别。两者都有效。

但要小心指针!如果你分配一个比初始值更长的字符串,你必须重新分配指针指向的空间!

MFG

+3

指针在此仅用于指向字符串_literals_,因此不需要重新分配任何内容。如果你要真正使用字符串,'std :: string'将为你处理重新分配。 – MSalters

1

的唯一理由退换货在上面的例子中的指针是,如果你想允许调用链接:

Modifying2(Modifying2(jdPtr)); 

其中,对于这个特定的实现,不作自多大意义该函数只是将一个值设置为常量。

在其他所有情况下,返回void可能是可取的,因为通过返回最初传入的相同指针不会获得任何结果。

+0

这个链接是不好的风格,因为它表明修改的顺序实际上是反转的 - 内部调用在外部调用之前完成。 – MSalters

+0

@ MSalters同意,这不是我要写的东西,我想这可能也不是作者在决定返回指针时想到的。 – ComicSansMS

0

修改它指向的值之后返回一个指针是多余的。 在现实世界中,像我们这样的其他人或您公司的同行代码将花费您大量的时间在您的代码中。

我忘了是谁说的,但你也会花90%的时间通过别人的代码。

如果我看到你的函数在工作中需要并返回一个指针,我会很困惑你为什么这么做,它似乎显示了对指针如何工作以及为什么你会传递一个函数指针的理解缺乏首先。

不要这样做。

相关问题