【C語言入門】166.指標與字串

這篇文章我們來介紹指標與字串之間的關係。

我們之前提過,字串是字元的序列,使用字元陣列儲存。

字串的特殊在於最後會用 ‘\0’ 代表字元陣列的結尾。

字元陣列可以用「字串」進行初始化,會自動加上 ‘\0’ 字元。

我們把字串存在陣列的時候,我們可以在初始化的時候用傳統的陣列初始化,如下。

char str[] = {'t', 'e', 's', 't', '\0'};

也可以直接用雙引號來初始化陣列,如下。

char str[] = "test";

用雙引號來初始化陣列是比較常用的做法。

基本上我們是用字元的陣列來儲存字串。

這時候就有一個問題了,字串和指標有甚麼關係呢?

這關係就來自於我們是使用陣列來儲存字串。

我們之前提到的陣列和指標的關係,其實也適用於字串和指標的關係。

當我們像在函式間傳遞字串的時候,我們會遇到和陣列一樣的問題。

陣列是無法直接複製的,字串也一樣無法直接複製。

我們不能直接在函式間傳遞字串,我們來看以下的例子。

#include <stdio.h>

int main()
{
    char strA[] = "test";
    char strB[] = {'t', 'e', 's','t','\0'};
    
    printf(strA);     //隱性轉型成指標
    printf(strB);     //隱性轉型成指標
}

其中 strA 會隱性轉型成一個指標,而一個字元陣列會隱性轉型成一個字元指標。

printf 是透過 strB 的 ‘\0’ 來判斷這個字傳有多長。

今天我們用字元陣列儲存字串,在函式間傳遞字串的時候,我們也是像陣列一樣,會隱性轉型成指標,然後傳遞相關的指標。

當我們使用雙引號的時候,是可以直接隱性轉型成字元的指標。

char *strC = "test";                     //(正確)
char *strD = {'t', 'e', 's', 't', '\0'}; //(錯誤)

以前我們是由字串轉成陣列,再把陣列轉成指標,然後才傳遞到函式裡。

後來,在 C99 的時候,提出了複合字面常數。

printf((char[]){'t', 'e', 's', 't', '\0'});  //(C99:複合字面常數)

我們在前面做一個強值轉型的動作,這時候我們確實可以把大括弧作為函式的傳遞。

雙引號和大括弧在這個層面上還是有點不一樣的。

雙引號還是可以直接隱性轉型的。

下一篇文章,我們會介紹雙引號的特別行,以及在這個特別性上造成的一些問題。

Leave a Comment

Your email address will not be published. Required fields are marked *