字串指標與字元陣列的區別

2021-07-03 21:31:34 字數 2568 閱讀 2798

用字元陣列和字元指標變數都可實現字串的儲存和運算。但是兩者是有區別的。在使用時應注意以下幾個問題:

字串指標變數本身是乙個變數,用於存放字串的首位址。而字串本身是存放在以該首位址為首的一塊連續的記憶體空間中並以『\0』作為串的結束。字元陣列是由於若干個陣列元素組成的,它可用來存放整個字串。

對字串指標方式

char *ps=」c language」;

可以寫為:

char *ps;
ps=」c language」;

而對陣列方式:

static char st=;
不能寫為:

char st[20];

st=;

而只能對字元陣列的各元素逐個賦值。

從以上幾點可以看出字串指標變數與字元陣列在使用時的區別,同時也可看出使用指標變數更加方便。
當乙個指標變數在未取得確定位址前使用是危險的,容易引起錯誤。

乙個錯誤的例子,如下:

char *name;

scanf(「%s」,name);

printf(「%s」,name);

有的編譯器雖然也能通過,但這是錯誤的,因為是個指標,定義時指向不可用的位址。解決這個問題有兩種方法:用陣列的方法或給字元針針分配記憶體空間的方法。

陣列的方法:

char name[20];

scanf(「%s」,name);

printf(「%s」,name);

給字元針針分配記憶體空間的辦法: 

char *name;

name=(char*)malloc(50); //此時name已經指向乙個剛剛分配的位址空間。

scanf("%s",name);

printf("%s",name);

但是對指標變數直接賦值是可以的。因為c系統對指標變數賦值時要給以確定的位址。

3.int main()

陣列和指標都可以在它們的定義中用字串常量進行初始化,儘管看上去一樣,底層的實現機制卻不相同。

定義指標時,編譯器並不為指標所指向的物件分配空間,它只是分配指標本身的空間,除非在定義的同時賦值給指標乙個字串常量進行初始化。例如:下面的定義建立了乙個字串常量(為其分配了記憶體):

char *p=」abcdefg」;

注意只有對字串常量才是如此,不能指望為浮點數之類的常量分配空間,如:

float *p=3.14; /*錯誤,無法通過編譯*/

下面結合乙個例項談談初始化指標時建立的字串常量與陣列中的字串的區別:

在ansi c中,初始化指標時所建立的字串常量被定義為唯讀。如果試圖通過指標修改這個字串的值,程式就會出現未定義的行為。在有些編譯器中,字串常量被存放在只允許讀取的文字段中,以防止它被修改。

陣列也可以用字串常量進行初始化:

char a=」abcdefg」;

如指標相反,由字串常量初始化的陣列是可以修改的。其中的單個字元在以後可以改變。

下面是乙個在vc6中的乙個例子,完成將乙個字串中的所有大寫字母全部轉換為小寫字母的功能:

[cpp] view plaincopy

view code

1#include

2#include

34 /**

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****/

5 /*

6 * convert a string to lower case

7*/89

int strlower(char *string)

10

1516

while(*string)

17

22*string='\0';

23return

0;

24 }

25 /*char

*strlower(char *string)

26

3435

s = string;

36while (*s)

40s++;

41 }

42*s = '\0';

43return string;

44 }

45*/

4647 void main() `這裡寫**片`

48

其中,如果採用char *test=」abcdefghijklmn」;會產生執行時錯誤。char test=」abcdefghijklmn」則程式正常執行,原因如前所述。

字串陣列與字串指標的區別

字元指標變數和字元陣列的區別 簡單說一下 字串陣列是用來存放字串的陣列,在記憶體中佔一段連續的單元。所佔記憶體存放的是字串。定義方法為 char a n n為常量表示式,可初始化。字元指標是指向字元的指標,所佔記憶體單元存放的是所指字元的記憶體單元。定義方法為 char p 完整的解答 1 字元陣列...

指標與陣列 字元指標,字串和字元陣列的區別

指標和陣列是不相等的,把乙個陣列名作為乙個引數傳遞給函式時陣列名就是指向第乙個元素的指標,在大多數表示式中 陣列名的值是指向第乙個元素的指標 有兩個例外,乙個是sizeof返回的是整個陣列 的位元組數,乙個是 操作符返回 的是乙個指向陣列的指標 但不代表 兩者等價。int a 3 int b 宣告乙...

字串常量指標與字元陣列的區別

陣列要麼在靜態儲存區被建立 如全域性陣列 要麼在棧上被建立。指標可以隨時指向任意型別的記憶體塊。1 修改內容上的差別 char a hello a 0 x char p world 注意p指向常量字串 p 0 x 編譯器不能發現該錯誤,執行時錯誤 2 用運算子sizeof可以計算出陣列的容量 位元組...