【发布时间】:2012-11-08 21:11:58
【问题描述】:
我试图在一个函数中声明指向类的指针,并以这个指针作为参数调用另一个函数。另一个函数试图创建类并将指向这个新创建的类的指针分配给输入指针。
第一种方法:
size_t packetLen = 0;
ETH2::PacketEthernetII* eth = NULL;
IPv4::PacketIPv4* ip4 = NULL;
ICMP::PacketICMP* icmp = NULL;
TCP::PacketTCP* tcp = NULL;
UDP::PacketUDP* udp = NULL;
if (!buildPackets(formats, packetLen, eth, ip4, icmp, tcp, udp)) {}
另一种方法:
bool Device::buildPackets(const Tokens& formats, size_t& packetLen,
ETH2::PacketEthernetII* eth, IPv4::PacketIPv4* ip4,
ICMP::PacketICMP* icmp, TCP::PacketTCP* tcp, UDP::PacketUDP* udp)
{
for (size_t i = 0; i < formats.size(); ++i) {
if (Utilities::startsWith(formats[i], ETH2PROTO)) {
eth = createEthernet2(formats[i]);
if (!eth)
return false;
packetLen += eth->len();
}
}
return true;
}
第二种方法正在起作用,并且 eth 为对象赋值。但返回第一种方法后,eth 为空......我不知道为什么。 我错过了哪些关于指针的重要细节?
【问题讨论】:
-
通过引用传递指针,例如
ETH2::PacketEthernetII*& eth而不是ETH2::PacketEthernetII* eth。 -
它有效,谢谢。但是为什么一定要通过引用传递呢?
-
因为 C++ 按值传递参数。这意味着每个函数调用都会复制其所有参数,以便值的变化不会传播到函数之外。通过引用传递会更改此行为以不复制参数,从而使更改在函数外部可见。
-
@3ka5_cat:否则你会得到一个参数值的copy,它是一个指针。
-
指向指针的指针也可以,但我更喜欢引用。