2015-02-10 177 views
0

假設我們有一個Address類指針指向字符串和STRCMP

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

如果我們有地址1和地址2的對象。這條線比較什麼?

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

addr是一個指向字符數組的指針。 & addr是指向字符數組的指針,然後將其轉換爲字符數組。那麼這是否應該實際比較兩個字符數組?

+1

'addr'不是一個指針,它是一個數組。無論如何,'strcmp(address1.addr,Address2.addr);'會更有意義... – chris 2015-02-10 21:58:05

+1

這是未定義的行爲。 strcmp被要求將2個指針視爲字符串。取出鑄件並閱讀編譯器錯誤消息 – pm100 2015-02-10 21:58:22

+0

[strcmp](http://www.cplusplus.com/reference/cstring/strcmp/)需要指向char的指針,而不是指向char的雙指針。 – Sheljohn 2015-02-10 22:00:03

回答

2

首先,讓我們明確一點:沒有指針在眼前任何位置的指針。
我們所擁有的是一個指向6 char數組。

因爲數組的地址總是第一個元素的地址,投使得(char *)&(Address1.addr)相當於&Address1.addr[0]

儘管在大多數情況下(例外是sizeof,地址爲(&)和其他一些地址),但這仍然過於複雜,因此數組會衰減爲指向其使用的第一個元素的指針。

因此,它可以而且應該寫入Address1.addr

現在,如果這些數組包含0結尾的字符串,一切都很好,儘管混淆沒有任何藉口。
它應該是:

strcmp(Address1.addr, Address2.addr) 
+0

雖然這並不好,因爲你正在將'char **'強制轉換爲'char *'。 – Sheljohn 2015-02-10 22:03:15

+1

@ Sh3ljohn:爲什麼它不好?他們保證指向相同的地址。 – Deduplicator 2015-02-10 22:04:29

+1

其實你是對的:)嗯,有趣。但坦率地說,我不確定OP應該被鼓勵認爲這很好。 – Sheljohn 2015-02-10 22:06:45

2

當傳遞一個數組T arr[N];給一個函數,它會促進(或降職,或任何你想將它命名),以T *,所以只是做

strcmp(ddress1.addr, Address2.addr); 

應該做的伎倆。

或者使用std::string和根本不擔心strcmp(和您不必擔心addr含有5個以上的字符,等等,等等

2
// "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/

而且這裏有什麼好商量意味着「陣列衰變爲指針」:

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