C語言字元指標變數和字元陣列的比較
阿新 • • 發佈:2019-02-14
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]。