2016-06-08 59 views
-3

我可能不完全理解我的代碼,或者不明白這是如何工作的。欣賞任何評論。將指針中的指向值比較,無需取消引用?

我似乎是能夠比較2個字符串文字而不需要提領它們。

我做:

if(tail->name==name) cout << "Match" << endl; 

這似乎工作。 Tail-> name和name都是char *字符串指針,* name是通過參數傳遞給函數的字符串。我應該不用* name == *來代替嗎?

唯一的另一種解釋是它會比較指針指向的值,但它應該像它一樣工作。

問候, 亞視

+1

你應該使用'strcmp'或'strncmp'。 – songyuanyao

+2

這是有效的比較指針地址值,這裏的問題是有意圖的,因爲你已經指出你的意圖是比較指針指向的值 – EdChum

+2

如果你使用C++,那麼爲什麼不使用'std ::字符串',可以使用'=='運算符通過值進行比較。 – MicroVirus

回答

1

這是絕對正確的,在某些情況下很好的優化。

但它有一個微妙之處。簡單比較的指針將從未產生假陽性,但反之則不然:如果tail->name指向不同的字符串,然後name if(tail->name==name)false甚至如果字符串的內容是相同的。

因此,在一般情況下,你無法使用這種方法,但你需要使用類似strcmp或者,在許多情況下更好的是,std::string

1

我似乎能夠比較2個字符串文字而不需要提領它們。

更準確地說,你是比較指向字符串文字的指針,而不是文字本身。

我不應該用* name == *來代替嗎?

如果您打算僅比較第一個字符,那麼是的,儘管tail->name[0] == name[0]在我看來會更具描述性。

如果您打算比較字符串的內容,那麼您必須取消引用指針,並且平行地遍歷每個字符串,比較沿途的字符。標準函數存在於:std::strcmp

如果你想要比較指針,那麼你現在正在做的是正確的。請注意,相同但獨立的字符串文字不保證具有相同的地址,因此這可能無法按照您的意圖進行。這取決於你的用例,這種方法是否合適。

我會嘗試用一個例子來解釋:

const char* argument = "test"; 
const char* name = argument; 
const char* another_name = argument; 
assert(name == another_name); 

斷言保證是真實的,應該有什麼可奇怪的了。指針是彼此的副本,並指向存儲字符串文字的相同地址。

但是:

const char* name = "test"; 
const char* another_name = "test"; 
assert(name == another_name); 

這種說法是不能保證是真的。但它也不保證是錯誤的。它沒有具體說明,直到實施。相同的字符串文字可以具有相同的地址應該不會令人感到意外,這是一個common optimisation。但你不能依賴這一點。在這種情況下,比較字符串的內容而不是地址,正如答案中前面所解釋的那樣。

+0

我打算比較字符串的內容。今晚我會發佈一個相關的代碼片段和結果,但基本上我傳入了一個char *參數,即「Lisa」,將它分配給tail-> name(tail-> name = argument),然後進行比較在tail-> name和傳入的*參數之間(如果(tail-> name == argument)),這似乎很奇怪地工作。 – ATv

+0

@AlefVeld我不覺得這很奇怪,這正是我期望的。我希望它能很好地解釋這種情況 – user2079303

+0

好吧,我明白了,所以你說這是一個編譯器優化(或未定義),而且它缺少一個更好的單詞,是我的字符串匹配的純粹運氣。我學到了一些新的東西,我沒有意識到編譯器可能會給相同的字符串文本賦予相同的指針地址,這......幾乎有點頑皮的編譯器(但是,如果我應該使用解除引用的值,則無論如何都是正確的)。將使用strcmp()或類似的東西。謝謝你的回答! – ATv