1. 程式人生 > 其它 >字串及字串陣列

字串及字串陣列

一、字串

字串:儲存在雙引號中,並且結尾是空字元\0的才算字串,空字元\0是編譯器自動加的,不需要人為加。

字串本身也表示一個地址,這個地址是字串首字元的地址,可以根據下面的程式來驗證:

//驗證字串本身的地址
#include <stdio.h>

int main(void)
{
char *ptchar="I love Rick!";
printf("print the adress of ptchar :%p\n",ptchar);//names是一個指標,儲存的是首字元的地址
printf("print the adress of the characters :%p\n","I love Rick!");//表示的是首字元的地址
printf("print the adress of names+1 :%p\n",ptchar+1);//表示的是第二個字元的地址
printf("print the adress of characters+1 :%p\n","I love Rick!"+1);//表示的是字串第二個字元的地址

return 0;
}

列印結果:

print the adress of ptchar :0000000000404000 print the adress of the characters :0000000000404000 print the adress of names+1 :0000000000404001 print the adress of characters+1 :0000000000404001

*在printf()、puts()、fputs()函式中,只要知道字串的首字元的地址,就可以根據%s轉換說明打印出這個完整的字串。

另外:字串巨集代表的也是字串首字元的地址。

例如:

//利用地址在輸出函式中打印出完整的字串
#include <stdio.h>
#define BBC "love"
int main(void)
{
char names[]="I love Rocky!";
char *ptchar="A handsome man!";
printf("print the characters :%s\n",names);
printf("print the characters :%s\n",BBC);
printf("print the characters :%s\n","love");
printf("print the characters :%s\n",ptchar);

puts(names);
puts(BBC);
puts("love");
puts(ptchar);

fputs(names,stdout);
fputs(BBC,stdout);
fputs("love",stdout);
fputs(ptchar,stdout);

return 0;
}

列印結果如下:

print the characters :I love Rocky! print the characters :love print the characters :love print the characters :A handsome man! I love Rocky! love love A handsome man! I love Rocky!loveloveA handsome man!

二、字串常量(字串巨集)

使用#define宣告的字串,我們叫做字串常量。(也叫字串巨集)

三、指標宣告字串

什麼是指標宣告字串:就是用指標來宣告一個字串。

例如:char *ptchar="I love opening the door."就叫用指標宣告一個字串。

從本質上來理解為什麼使用指標來宣告字串:

首先:I love opening the door.是一個字串,計算機首先會為他尋找一個記憶體,儲存在程式中。

其次:這個指標ptchar儲存的是字串中首字元的地址,知道字串的首地址了,那麼我們就可以根據這個地址在記憶體中找到這個字串。這樣做相比於建立陣列而言,可以直接訪問原始資料的地址。

例如:

//測試2
#include <stdio.h>
int main(void)
{
char *ptchar="ABCDEFG";//指標宣告字串

printf("列印指標所儲存的地址:%p\n",ptchar);
printf("列印字串首字元的地址:%p\n","ABCDEFG");

return 0;
}

列印內容如下:

列印陣列首元素的地址:0000000000404000 列印字串首字元的地址:0000000000404000

四、字串陣列(一維)

字串陣列和其他陣列一樣,只不過,字串陣列的初始化要用雙引號。

*重點內容:一維陣列的陣列名稱就是一個指標,這個指標儲存的內容是字串首字元的地址。

初始化的本質:例如: char names[20]="I love Rick very much."這個字串陣列

首先:計算機會給I love Rick very much.這個字串一個記憶體,這個字串儲存在了程式中。

建立了names[20]這個陣列,計算機會分給這個陣列一個記憶體,陣列中的20個元素也儲存在程式中。

其次:計算機再將這個字串複製一份,放入這個字串陣列中,沒有儲存字元的元素將被初始化為空字元\0。

如果對陣列初始化:那麼不必知道這個陣列的大小,計算機會按照字串的大小自動為陣列分配大小,如果字串中由n個字元,1個空字元,那麼陣列的大小就是n+1。

如果不對陣列進行初始化:那麼陣列必須要有大小。

//測試
#include <stdio.h>

int main(void)
{
char dates[20];//首先,必須宣告這個陣列中元素的個數

fgets(dates,15,stdin);//stdin表示輸入的內容是儲存在輸入快取流中的 ,然後直接儲存在陣列中。

fputs(dates,stdout);

char times[20]="ABCDEFG";

printf("列印陣列首元素的地址:%p\n",times);
printf("列印字串首字元的地址:%p\n","ABCDEFG");

return 0;

}

列印結果如下:

hhhjhjhjuu hhhjhjhjuu 列印陣列首元素的地址:000000000062FDE0 列印字串首字元的地址:000000000040401A

五、字串陣列(二維)

二維字串陣列是由多個一維字串陣列組成的。

例如:char names[4] [20];

表示的是是由4個一維字串陣列組成的,每個一維字串陣列最大可以容納20個字元。

names是二維字串陣列的名稱,這是一個指向一維字串陣列的指標,儲存的是第一個一維字串的地址。

names[0]是一維字串的名稱,這是一個指向字元的指標,儲存的是第一個一維字串陣列中首字元的地址。