char陣列 、char指標與字串常量的比較
阿新 • • 發佈:2019-01-09
陣列不是基本型別,不能直接參與比較,陣列與字串及字元指標與字串比較其實比較的是二者的地址。
例:
int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}
int main()
{
char test[] = "char";
char *temp = "char";
printf("%d", isequiv(test));//輸出 0
printf("%d", isequiv(temp));//輸出 1
return 0;
}
那麼為甚麼test與temp同字串“char”比較時結果會不一樣呢?其實t=="char"比較的是地址!
char* p1 = "char";
char* p2 = "char";
char* p3 = "char";
char* p4 = "char";
這裡的 p1 p2 p3 p4 的值都一樣,都是指向常量區字串 "char", 比如上面的 0x004038b0
然而當你這麼只用的時候
char test[] = "char";
這裡情況就和上面的不一樣了,這樣寫的時候,編譯器並不是讓test也指向常量區的字串"char",而是在本地堆疊分配了一段和"char"一樣大的空間,如何把常量區字串"char" 拷貝到test
可以這麼理解
char* p1 = "char"; p1 和 常量區的"char"是同一個東西,地址相同
char test[] = "char"; test和 常量區的"char"不是同一個東西,但是內容相同
int isequiv(char *t) { if (t == "char") return 1; else return 0; }
以上面為例子 當你這麼比較的時候 if (t == "char") 編譯器是去比較t和"char"是不是同一個東西,它們的值(字串的地址)是不是一樣,而不是比較它們的內容是不是一樣 由前面的講解可以知道 char* p1 = "char"; p1 和"char"的值是一樣的 char test[] = "char"; test 和 "char"的值不一樣,只是它們指向的字串內容一樣而已 要比較兩個字串的內容是不是一樣,用 strcmp()返回0就是一樣 比如,你那個函式可以改為
int isequiv(char *t) { if (strcmp(t, "char") == 0) return 1; else return 0; }
ps:你要理解兩個感念, 同一個東西 內容相同的兩個東西
注:字串比較用用strcmp()函式,strcmp(test,"char")及strcmp(temp,"char")!
轉自:http://bbs.csdn.net/topics/300002842