字元指標變數和字元陣列的對比

2021-08-06 05:30:15 字數 3168 閱讀 3752

使用字元陣列和指標變數都能實現字串的儲存和運算,但它們兩者之間是有區別的,不應混為一談,主要有一下幾點:

(1)字元陣列由若干個元素組成,每個元素中放乙個字元,而字元指標變數中存放的是位址(字串中第乙個字元的位址),絕不是將字串放到字元指標變數中。

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

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

char *a;  //a為字元指標變數

a="i love china!"; //將字串首元素位址賦給指標變數合法。但賦給

a的不是字串,//

而是字串第乙個元素的位址

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

char str[14];

str[0]='i'; //對字元陣列元素賦值,合法

str="i love china!"; //陣列名是位址,是常量,不能被賦值,非法

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

char *a="i love china!"; //定義字元指標變數

a,並把字串第乙個元素的位址賦給

a等價於

char *a; //定義字元指標變數

aa="i love china!"; //把字串第乙個元素的位址賦給

a而對於陣列的初始化:

char str[14]="i love china!"; //定義字元陣列

str,並把字串賦給陣列中各元素

不等價於

char str[14]; //定義陣列

strstr="i love china!"; //企圖把字串賦給陣列中各元素,錯誤

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

(4)儲存單元的內容。編譯時為字元陣列分配若干儲存單元,以存放各元素的值,而對字元指標變數,只分配乙個儲存單元。

如果定義了字元陣列,但未對它賦值,這時陣列中的元素的值是不可預料的。可以輸出這些值,結果顯然是無意義的。

如果定義了字元指標變數,應當及時把乙個字元變數(或字元陣列元素)的位址給它,使它指向乙個字元型資料,如果未對它賦予乙個位址值,它並未指向乙個確定的物件。此時如果向該指標變數所指的物件中輸入資料,可能會出現嚴重後果。如下面這個錯誤做法:

char *a; //定義字元指標變數

ascanf("%s",a); //企圖從鍵盤輸入乙個字串,使

a指向該字串,錯誤。

這種方法是危險的,因為編譯時給指標變數a分配了儲存單元,變數

a的位址(即

&a)是已經指定了,但

a並未被賦值,在

a的儲存單元中是乙個不可預料的值。應當在定義指標變數後,及時指定其指向。如:

char *a, str[10]; //定義了字元指標變數

a和字元陣列

stra=str;                //使a指向

str陣列的首元素

scanf("%s",a);  //從鍵盤輸入乙個字串存放到

a所指向的一段儲存單元中,正確

先使a中有確定值,使

a指向乙個陣列元素,然後輸入乙個字串,把它存放在以該位址開始的若干單元中。

(5)指標變數的值是可以改變的,而陣列名代表乙個固定的值(陣列首元素的位址

),不能改變。例1

:改變指標變數的值

#includeint main()

執行結果:

china!

程式分析:指標變數a的值是可以變化的。p

rintf

函式輸出字串時,從指標變數

a當時指向的元素開始,逐個輸出各個字元,直到遇'\0'為止。而陣列名雖然代表位址,但它是常量,值不能改變。

char str=;

str=str+7; //錯誤!

printf("%s",str);

(6)字元陣列中各元素的值是可以改變的(可以對它們再賦值

),但字元指標變數指向的字串常量中的內容是不可以被取代的

(不能給它們再賦值

)。如:

char a = "house"; //字元陣列

a初始化

char *b = "house"; //字元指標變數

b指向字串常量的第乙個字元

a[2] = 'r'; //合法,r取代

a陣列元素

a[2]

的原值u

b[2] = 'r'; //非法,字串常量不能改變

(7)引用陣列元素。對字元陣列可以用下標法(用陣列名和下標)引用乙個陣列元素(如a[5]),也可以用位址法(如

*(a+5)

)引用陣列元素

a[5]

。如果定義了字元指標變數

p,並使它指向陣列

a的首元素,則可以用指標變數帶下標的形式引用陣列元素(如

p[5]

),同樣,可以用位址法(如

*(a+5)

)引用陣列元素

a[5]

。如有:

char *a="i love china!"; //定義指標變數

a,指向字串常量

則a[5]的值是字母'e'。

雖然並未定義陣列a,但字串在記憶體中是以字元陣列形式儲存的。

a[5]

按*(a+5)

處理。(8)用指標變數指向乙個格式字串,可以用它代替printf函式中的格式字串。

例如:

char *format;

format="a=%d,b=%f\n"; //使

format

指向乙個字串

printf(format,a,b);

因此只要改變指標變數format所指向的字串,就可以改變輸入輸出的格式。這種

printf

函式稱為可變格式輸出函式。

也可以利用字元陣列實現。例如:

char format="a=%d,b=%f\n";

printf(format,a,b);

但使用字元陣列時,只能採用在定義陣列時初始化或逐個對元素賦值的方法,而不能採用賦值語句對陣列整體賦值,例如:

char format;

format="a=%d,b=%f\n"; //非法

因此使用指標變數指向字串的方法更為方便。

字元指標變數和字元陣列的討論

經常會弄錯字元指標變數和字元陣列的使用方式 寫在這裡方便查閱 1 內容不同 字元陣列由若干個元素組成,每個元素放乙個字元。而字元指標變數中存放的是位址 字串第乙個字元的位址 決不是將字串放到字元指標變數中。2 賦值方式 對字元陣列只能對各個元素賦值,不能用以下方法 char str 14 str i...

字元陣列和字元指標

字元陣列是一段記憶體空間 字元指標是乙個位址,指向一串字元。char str abcd char str abcd 字元陣列是一段記憶體空間 字元指標是乙個位址,指向一串字元 char str abcd char str abcd 上面這兩跳複製語句很相似,其實根本就不是一碼事。對於兩個 abcd ...

字元指標和字元陣列

1.字元指標可以指向乙個字串。我們可以用字串常量對字元指標進行初始化。例如,有說明語句 char str this is a string.是對字元指標進行初始化。此時,字元指標指向的是乙個字串常量的首位址,即指向字串的首位址。這裡要注意字元指標與字元陣列之間的區別。例如,有說明語句 char st...