概念:在記憶體中連續儲存的具有相同資料型別的一組資料的集合。
注意:
定義陣列時候的注意事項:
如圖可以看出,陣列元素在記憶體中的儲存地址是連續的,尤其注意以下內容的區分。
總結:陣列名是一個地址常數(第0個元素的首地址);&a[0]代表第0個元素的首地址;&a代表的是整個陣列的地址。
初始化:在定義陣列的同時進行賦值,成為初始化。
範例:
#include<stdio.h>
int num1[5];
int main()
{
int num2[5];
for (int i = 0; i < 5; i++)
{
printf("%d ", num1[i]);
}
printf("\n");
for (int i = 0; i < 5; i++)
{
printf("%d ", num2[i]);
}
return 0;
}
執行結果如下:
注意:
定義:型別說明符 陣列名[常數表示式1] [常數表示式2]
int a[2] [3]
#include<stdio.h>
int main()
{
char c[] = {'a','b','c'};//普通的字元陣列
printf("%s\n", c);//亂碼,因為沒有'\0'結尾,用%s列印出錯
//有'\0'結尾的字元陣列就是字串
char c1[] = { 'a','b','c','\0'};
printf("%s\n", c1);
char c2[]= { 'a','b','c','\0' ,'d','e','f'};
printf("%s\n", c2);// \0後面的部分不會被列印
return 0;
}
執行結果如下:
列印字串的時候遇到'\0'就停止列印,字元陣列含有'\0'就是字串。
注意:char c[] = "hello",用" "括起來的就是字串,此時編譯器會自動在後面加上\0,在內部其實是這樣的額char c[] = {'h','e','l','l','o','\0'}。
scanf 遇到空格結束,遇到\n結束,所以用scanf這種方式並不是很好,有時候想要讀取一個hello world遇到空格結束,只能讀取到hello。
範例:
#include<stdio.h>
int main()
{
char buf[5] = "";
fgets(buf, sizeof(buf), stdin);
printf("%s\n", buf);
return 0;
}
執行結果如下:
fgets會把確認鍵\n讀取,但是scanf和gets遇到\n會結束讀取。
有一種情況,定義了一個陣列char a[3];,輸入的時候輸入的是a+回車,那麼此時用fgets獲取char陣列內的內容就是a[3] = {'a','回車','\0'};
如何去掉\n?
只需要將\n替換成\0
範例:
char buf[128] = "helloA";//buf[5]=0;
int i=0;
while(buf[i]!='\0')
{
i++;
}
buf[i-1] = '\0';
printf("%s\n",buf);
size_tn strlen(const char s);
功能:計算指定指定字串s的長度,不包含字串結束符‘\0’
引數:s:字串首地址
返回值:字串s的長度,size_t為unsigned int型別
fgets相對於scanf和gets不會汙染記憶體(安全),但是fgets會讀取\n,所以只需要將\n去掉就可以了。
char buf[1024] = "hello world";
printf("%s\n",buf)
列印字串的時候遇到'\0'就停止列印。
*int puts(const char s);
功能:標準裝置輸出s字串,在輸出完成後自動輸出一個'\n'。
char buf[1024] = "hello world";
puts(buf);//陣列首元素地址,有換行
**int fputs(const char str,FILE stream);
功能:將str所指定的字串寫入stream指定的檔案中,字串結束符'\0'不寫入檔案。
引數:str:字串
stream:檔案指標,如果把字串輸出到螢幕,就固定寫為stdout
char buf[1024] = "hello world";
fputs(buf,stdout);//第一個引數,陣列元素首地址,第二個引數stdout標準輸出