指向字符串和strcmp的指针
pointers to pointers to strings and strcmp
假设我们有一个地址类
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
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- C++搜索文件名指针指向字符串 strcmp 错误
- 指向字符串和strcmp的指针