指向字符串和 strcmp 的指针

pointers to pointers to strings and strcmp

假设我们有一个地址 class

class Address{
public:
  char addr[6];
}

如果我们有 Address1 和 Address2 对象。这条线比较什么?

strcmp((char *)&(Address1.addr), (char *)&(Address2.addr))

addr 是指向字符数组的指针。 &addr 是指向字符数组指针的指针,然后将其转换为字符数组。那么这是否应该实际比较两个字符数组?

当将数组 T arr[N]; 传递给函数时,它将被提升(或降级,或任何你想调用它的东西)到 T *,所以只需要做

 strcmp(ddress1.addr, Address2.addr);

应该可以解决问题。

或者使用 std::string 并且根本不用担心 strcmp(而且你不必担心 addr 有超过 5 个字符,等等等等。

首先,让我们明确一点:在任何地方都看不到指向指针的指针。
我们有一个指向 6 char.

数组的指针

因为数组的地址始终是其第一个元素的地址,所以转换使 (char *)&(Address1.addr) 等同于 &Address1.addr[0]

虽然在大多数情况下(例外是 sizeof、地址 (&) 和其他一些情况),这仍然太复杂了,但数组会衰减到指向其第一个元素的指针使用中。

因此,可以而且应该写成Address1.addr

现在,如果这些数组包含以 0 结尾的字符串,一切都很好,尽管没有理由混淆。
应该是:

strcmp(Address1.addr, Address2.addr)
// "std::string" might be better, but OK...
class Address{
public:
  char addr[6];
}
...

// Compare one address with another
int iret = strcmp (address1.addr, address2.addr);

// Or, equivalently, 
int iret = strcmp (&address1.addr[0], &address2.addr[0]);

这里有一个关于 C 风格字符串(空终止字符数组)的很好的讨论:

https://www.cs.bu.edu/teaching/c/string/intro/

这里很好地讨论了 "arrays decay into pointers":

的含义

http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr