1. 程式人生 > >C語言之對char*與char[]的理解

C語言之對char*與char[]的理解

    在我們學習的過程中,在定義字串時常常會用char* 或者 char[]去定義一個字串,可是這兩個的區別卻天差地別。
    今天在這裡我闡述一下自己對這兩種定義的理解與看法。
    首先分別用這兩種方法定義字串,如下。
    char *str1 = "abcd1234";
    char str2[] = "abcd1234";
    接下來,我們分別對這兩種方法定義的字串進行測試。
    printf("%d  %d\n",str1,str2);

執行結果

    顯而易見,這兩種定義的方法在strlen的作用下的值是一樣的,其字串的長度並無差別。
    再進行下面的測試。
    char *str1 = "abcd1234";
    char *str2 = "abcd1234";
    char str3[] = "abcd1234";
    char str4[] = "abcd1234";

    printf("%p %p\n",str1,str2);
    printf("%p %p\n",str3,str4);
    如果這樣執行的話,結果會是什麼呢?

這裡寫圖片描述

    這是為什麼呢?用char * 定義的兩個內容一樣的字串的地址竟然是一樣的,而char [] 這樣定義的內容相同的字串卻不一樣?
    我們接下來繼續看。
    char
*str1 = "abcd1234"; char str2[20] = "abcd1234"; strncat(str1,str2,4); printf("%s\n",str1);
    用strncpy來進行測試,意思為將str2的前四個位元組的內容複製到str1中。我們來看看結果如何。

這裡寫圖片描述

    我們發現,程式直接崩潰掉了。如果這樣來呢?
    char *str1 = "abcd1234";
    char str2[20] = "abcd1234";

    strncpy(str2,str1,4);
    printf("%s\n",str2);    

這裡寫圖片描述

    此時,卻可以正常的使用。那麼之前的那些是什麼原因導致的呢?
    經過分析以及自己的理解,char str[]這裡單獨的str表示的是一個char型別的陣列指標,該指標所指向的陣列內容是儲存在棧上面的,是可以修改的。而char *str是一個字串指標,這個指標指向的是字串第一個字元的地址,而這個指標存在棧上,但是字串的內容並不在棧裡面,而在字元常量區域裡面儲存。所以檢視char *str1 = "abcd1234"與char *str2 = "abcd1234"的地址時,他們都是儲存的字元a的地址,所以這個地址時相同的,所以其 %p 的值也是一樣的,但是char str3[] = "abcd1234" 與 char str[] = "abcd1234"是分別兩個char型別的陣列,而str3與str4分別表示的是char型的陣列指標,所以他們的地址時不同的。      
    char *str1 = "abcd1234";
    char str2[20] = "abcd1234";

    strncat(str1,str2,4);
    當我們測試以上程式碼時,由於在棧裡面儲存的僅有字元的地址,所以當進行字串拼接時,首先在棧裡面找不到str1中的"abcd1234"而這時的字串在字元常量區,是無法修改的,所以出現了程式崩潰,報錯。
    char *str1 = "abcd1234";
    char str2[20] = "abcd1234";

    strncpy(str2,str1,4);
    printf("%s\n",str2);    
    而當我們測試上面的程式碼時,如果陣列一樣,利用指標的訪問,是可以輕而易舉的改變、修改、拼接str2,所以可以進行strncat的執行。






    本人愚見,歡迎大家共同探討研究,如果錯誤,請及時聯絡作者進行修改更正,謝謝大家!