假設我們有一個Address類指針指向字符串和STRCMP
class Address{
public:
char addr[6];
}
如果我們有地址1和地址2的對象。這條線比較什麼?
strcmp((char *)&(Address1.addr), (char *)&(Address2.addr))
addr是一個指向字符數組的指針。 & addr是指向字符數組的指針,然後將其轉換爲字符數組。那麼這是否應該實際比較兩個字符數組?
假設我們有一個Address類指針指向字符串和STRCMP
class Address{
public:
char addr[6];
}
如果我們有地址1和地址2的對象。這條線比較什麼?
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)
雖然這並不好,因爲你正在將'char **'強制轉換爲'char *'。 – Sheljohn 2015-02-10 22:03:15
@ Sh3ljohn:爲什麼它不好?他們保證指向相同的地址。 – Deduplicator 2015-02-10 22:04:29
其實你是對的:)嗯,有趣。但坦率地說,我不確定OP應該被鼓勵認爲這很好。 – Sheljohn 2015-02-10 22:06:45
當傳遞一個數組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風格的字符串商量好了(空字符數組):
https://www.cs.bu.edu/teaching/c/string/intro/
而且這裏有什麼好商量意味着「陣列衰變爲指針」:
'addr'不是一個指針,它是一個數組。無論如何,'strcmp(address1.addr,Address2.addr);'會更有意義... – chris 2015-02-10 21:58:05
這是未定義的行爲。 strcmp被要求將2個指針視爲字符串。取出鑄件並閱讀編譯器錯誤消息 – pm100 2015-02-10 21:58:22
[strcmp](http://www.cplusplus.com/reference/cstring/strcmp/)需要指向char的指針,而不是指向char的雙指針。 – Sheljohn 2015-02-10 22:00:03