1. 程式人生 > >C語言字元指標變數和字元陣列的比較

C語言字元指標變數和字元陣列的比較

C語言是沒有字串型別的,字串是存放在字元型陣列中。C語言只有字元變數,沒有字串變數。

使用字元指標變數和字元陣列的比較:

(1)字元陣列有若干個原始組成,每隔元素中放一個字元,而字元指標變數中存放的是地址(字串第一個字元的地址),絕不是將字串放到字元指標變數中。

(2)賦值方式:可以對字元指標變數賦值,但對不能對數字名賦值。

            可以採用下面方法對字元指標變數賦值:

char *a;                   //a為字元指標變數
a = "I love China";        //將字串首元素地址賦給指標變數,合法。但賦給a的不是字串,而是字串第一元素的地址。

            不能用以下辦法對字元陣列名賦值:

str[0] = 'I';                    //對字元陣列元素賦值,合法!
str = "I love China";            //陣列名是地址常量,不能被賦值,非法!

(3)初始化的含義,對字元指標變數賦初值:

char *a = "I love China";//定義字元指標變數a,並把字串第一個元素的地址賦給a

        等價於:

char *a;                   //定義字元指標變數a
a = "I love China";        //把字串第一個元素的地址賦給a

        而對陣列的初始化:

char str[14] = "I love China"; //定義字元陣列str,並把字串賦給陣列中各元素

        不等價於:

char str[14];                //定義字元陣列str
str = "I love China";        //企圖把字串賦給陣列中各元素,錯誤

        陣列可以在定義時對各元素賦初值,但不能用賦值語句對字元陣列中全部元素整體賦值。

(4)儲存單元的內容。

        編譯時為字元陣列分配若干儲存單元,以存放各元素的值,而對字元指標變數,只分配一個儲存單元(32位機一般4B)

(5)指標變數的值是可以改變的,而陣列名代表一個固定的值(陣列元素的地址),不能改變。

char *a = "I love China";
a = a + 7;                //改變指標變數的值,即改變指標變數的指向
printf("%s\n", a);        //輸出從a指向的字元開始的字串
char str[] = "I love China";
str = str + 7;            //陣列名雖然代表地址,但它是常量,值不能改變。不合法。

(6)字元陣列中各元素的值是可以改變的(可以對它們再賦值),但是字元指標變數指向的字串常量中的內容是不可以被取代的(不能再賦值)。

char q[] = "abcdefghi";
printf("%c\n", *q);
*q = 'c';            // 正確
printf("%c\n", *q);
char *p = "abcdefghi";
printf("%c\n", *p);
*p = 'c';            // 錯誤
printf("%c\n", *p);

(7)引用陣列元素。

            字元陣列可以用下表法(用陣列名和下表)引用一個數組元素(如a[5]),也可以用地址法(如*(a + 5))。

            如果定義了字元指標變數p,並使他指向陣列a的首元素,則可以用指標變數帶下表的形式引用陣列元素(如p[5]),地址法(如*(p + 5))引用陣列元素a[5]。