1. 程式人生 > >char陣列 、char指標與字串常量的比較

char陣列 、char指標與字串常量的比較

陣列不是基本型別,不能直接參與比較,陣列與字串及字元指標與字串比較其實比較的是二者的地址。

例:

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",它表示儲存在程式的常量區的一串字串,它返回的就是這個常量區的字串地址比如假設這個地址是 0x004038b0 "char",那麼當你使用 char *temp = "char";的時候,temp就得到了這個常量字串的地址,也就是temp等於 0x004038b0   或許你可以試試
    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