(1)一维数组的定义格式:
类型说明符 数组名 [常量表达式];
例如 int a[10];
声明数组时要遵守的规则
1.数组名的命名规则和变量名相同,及遵守标识符命名规则
2.定义数组时需要指定数组元素中的个数,方括号中的常量表达式用来表达元素个数,即数组长度
3.常量表达式可以包含常量和符号常量,但不能包括变量,也就是说c语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中国变量的值(新版c标准支持,但包含变量的数组不能进行初始化)
初试复试的学校测试一般版本比较旧,最好不要包含变量
(2)一维数组的初始化方法
1在定义数组时对数组元素赋初值例如
int a[10]={0,1,2,3,4,5,6,7,8};
//而不能写成
int a[10];
a[10]={0,1,2,3,4,5,6,7,8];
2可以只给一部分元素赋值例如
int a[10]={0,1,2,3,4};
定义数组a中有十个元素,但花括号中只提供五个初值,这表示只给前五个元素赋值,剩余元素为0
3如果要让一个数组全部值为0,只需要
int a[10]={0};
不需要十个元素都打一遍,这会让批卷老师认为没有学懂c语言
4在对全部数组赋值初值时,由于数据个数确定,因此可以不指定数组长度。
例如
int a[]={1,2,3};
最好不要这样初始化,会导致改卷老师不得不数元素个数,导致步骤分的多扣
数组的访问越界
内存访问的异常,越界访问导致其他变量储存位置被覆盖
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int j=19;
int g=12;
a[5]=10;
a[6]=13;
printf("%d %d",j,g);
//此时g的取值变为了13,原因为a[6]占用了g的地址,导致了g取值的变化
return 0;
}
另外需要注意,编译器不会检查程序对数组下标的引用是否合法
(3)数组的传递
另外注意
调试按钮折弯F8 当前函数一步步往下走
向下箭头F7 到达某个函数
#include<stdio.h>
//数组长度是无法传递的所以需要新建变量传入
//数组名传递到子函数后,子函数的形参接受到的是数组的起始地址,所以sizeof(a)为8
void print(int a[])
{
int i;
for(i=0;i<sizeof(a)/sizeof(int);i++)
{
printf("%d\n",a[i]);
}
}
int main()
{
int a[4]={1,2,3,4};
print(a);
return 0;
}
修改后
#include<stdio.h>
//数组长度是无法传递的所以需要新建变量传入
//数组名传递到子函数后,子函数的形参接受到的是数组的起始地址,所以sizeof(a)为8
void print(int a[],int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d\n",a[i]);
}
}
int main()
{
int a[5]={1,2,3,4,5};
print(a,4);
return 0;
}
(4)字符数组的初始化
对每个单独赋值进行初始化非常麻烦,而对整个初始化也很麻烦,所以一般的初始化格式为
char a[9]="i am happy";//好处有两点
//1.容易输入
//2.若数字内还有空间则自动输入结束符号\0
(5)字符数组输出乱码的情况
字符数组中没有结束符就会导致乱码,因为循环输出时会一直输出直到找到\0为止
上图的赋值必须要预留足够的空间如果没空间则不会自动输入\0
一旦输出乱码,一定要去找字符数组是否含有结束符,另最好不要输出中文字符
(6)scanf读取字符串
#include<stdio.h>
int main()
{
char a[9];
scanf("%s",a);
printf("%s",a);
return 0;
}
注意
1.字符数组a中存储了地址,因此不用在scanf后加&
2.字符数组的scanf读取,无法读取空格,而会直接导致读取结束,空格后的内容会留在缓冲区,二次读取时会忽略最前面被预留的空格
则可以用空格分割输入的字符串,一次性输入不同的字符串中
例
#include<stdio.h>
int main()
{
char a[9];
char b[9];
scanf("%s%s",a,b);
printf("%s %s",a,b);
return 0;
}
(7)gets函数和puts函数
gets的特点:一次读一行,无论中间是否有空格或者其他符号都会读进取,直到遇到\0才停止
和scanf的读取特点相反,scanf最后读取到空格直接停止
puts的特点:puts(a);等价于printf("%s\n",a);
(8)str系列(初试不重要,复试的机试会涉及)
strlen()算出字符数组的长度(忽略\n)
#include<stdio.h>
int main()
{
char a[9];
char b[9];
scanf("%s%s",a,b);
printf("%s %s",a,b);
int len=0;
len=strlen(a);
printf("%d",len);
return 0;
}
strcat(a,b)将a和b字符串相接,即将b中的内容拼接到a中
#include<stdio.h>
int main()
{
char a[9];
char b[9];
scanf("%s%s",a,b);
strcat(a,b);//把d的内容拼接到a
printf("%s %s",a,b);
int len=0;
len=strlen(a);
printf("%d",len);
return 0;
}
strcmp(a,b)比较字符串a,b的大小 a?b中若为>返回正值,<返回负值=返回0
strcpy (a,b)将b复制进a
注意
strcpy(a,b)和strcat(a,b)中a的取值不能为字符串常量,必须有空间,否则无法拼接或者复制