指向字符串和strcmp的指针

pointers to pointers to strings and strcmp

本文关键字:指针 strcmp 字符串      更新时间:2023-10-16

假设我们有一个地址类

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

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

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

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

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

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

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

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

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

strcmp(Address1.addr, Address2.addr)

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

 strcmp(ddress1.addr, Address2.addr);

应该做到这一点。

或者使用std::string,完全不用担心strcmp(也不必担心addr包含5个以上的字符等)。

// "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风格字符串(以null结尾的字符数组)的一个很好的讨论:

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

这里有一个很好的讨论"数组衰减为指针"的含义:

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