概念:在内存中连续存储的具有相同数据类型的一组数据的集合。
注意:
定义数组时候的注意事项:
如图可以看出,数组元素在内存中的存储地址是连续的,尤其注意以下内容的区分。
总结:数组名是一个地址常量(第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标准输出