一、一维数组

数组是具有相同类型变量的集合,这些变量在内存中占有连续的存储单元
1、类型说明符,实际上说明的是数组元素的取值类型,同一个数组,所有数组元素的数据类型一致。
2、数组名,属于标识符,其命名应符合标识符的命名约定。
3、常量表达式,必须用方括号括起来,而不是圆括号。
4、方括号内的常量表达式,表示数组元素的个数,即数组的长度。
5、不能在方括号中,用变量来表示数组元素的个数,只能是符号常量常数
6、允许在同一个类型说明中,同时定义多个数组多个变量
#define N 5 int a[N]; (可以)
int b[4],c[7]; (可以)
long d[10]; (可以)
float 1d[3]; (不可以)
double d1[n]; (不可以)
long f(4); (不可以)
一维数组的初始化
1、定义一维数组时可以将各元素的初始值依次放在一对{}中赋给数组(必须用{}将初值括起,且初值之间用一个逗号分割)。
int a[5]={19,45,66,90,100,80};
2、多则出错;少则补0
3、定义赋初值的个数等于数组长度,则数组长度可以省略
int a[]={19,45,66,90,100,80};
4、一个也不给则是0
5、只能在定义数组的同事用{}给数组元素整体赋值
一维数组的引用
数组名[下标]
注:C语言中不能对数组进行整体引用只能单独引用其中的元素。
引用时下标可以试表达式。

二、二维数组

二维数组的定义
类型名 数组名[整形常量表达式1][整型常量表达式2]
例如:int a[3][4];
第1列 第2列 第3列 第4列
第1行 a[0][0] a[0][1] a[0][2] a[0][3]
第2行 a[1][0] a[1][1] a[1][2] a[1][3]
第3行 a[2][0] a[2][1] a[2][2] a[2][3]
每个元素都有两个下标,第一个方括号中的下标代表行号,称为行下标;
第二个方括号中的下标代表列号,称为列下标。行下标和列下标的下限总为0。
a数组中的元素在内存中也是占一片连续的储存单元。
QQ截图20210907200910.png
1、不能整体引用 只能引用其中的元素
2、引用二维数组元素时,必须有行下标和列下标两个下标。从0开始依次加1
为所定义的数组元素赋初值:
int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
a[0][0]=1; a[0][1]=2; a[0][2]=3; a[1][0]=4; a[1][1]=5; a[1][2]=6;
a[2][0]=7; a[2][1]=8; a[2][2]=9; a[3][0]=10; a[3][1]=11; a[3][2]=12;
当每行所赋初值的个数与数组元素个数不同时:
int a[4][3]={{1,2},{4,5},{7},{10}};
a[0][0]=1; a[0][1]=2; a[0][2]=0; a[1][0]=4; a[1][1]=5; a[1][2]=0;
a[2][0]=7; a[2][1]=0; a[2][2]=0; a[3][0]=10; a[3][1]=0; a[3][2]=0;
当所赋初值行数少于数组行数时:
int a[4][3]={{1,2},{4,5}};
a[0][0]=1; a[0][1]=2; a[0][2]=0; a[1][0]=4; a[1][1]=5; a[1][2]=0;
a[2][0]=0; a[2][1]=0; a[2][2]=0; **a[3][0]=0; a[3][1]=0; a[3][2]=0;
当所赋初值省略行花括号时:
int a[4][3]={1,2,4,5};
a[0][0]=1; a[0][1]=2; a[0][2]=4; a[1][0]=5;
a[1][1]=0; a[1][2]=0;
a[2][0]=0; a[2][1]=0; a[2][2]=0; a[3][0]=0; a[3][1]=0; a[3][2]=0;
第一维的大小按以下规则决定:
当花括号中的个数能
整除第二维,整除的结果就是第一维的大小;否则,第一维的大小等于所得的结果加1**。

三、字符数组

字符常量:是用单引号括起来的一个字符。
‘A’ ‘C’ ‘t’ ‘!’ ‘?’ 在内存中占一个字节
字符串常量:是由双引号括起来的一串字符。
“CHINA” 在内存中占6个字节 在内存中存储形式是:C H I N A \0
在内存中,系统会自动的在字符串的末尾加上一个’\0‘,作为字符串的结束标志,系统只要看到它就认为该字符
穿到此就结束了。但要注意该字符串的实际长度还是为5
由于变量只能存放一个字符,所以字符串的存放只能存储在数组当中。
可以直接用字符串常量给一维字符数组赋初值。例如:
char str[10]={“string!”}; char str[10]=”string!”;
把一个字符串常量赋值给一个一维字符数组时,数组的元素个数要大于字符串的实际长度
char str[6]=”string!”; ‘\0’将无法存放
如下的定义形式也可以正确进行:char str[]=”string!”;
模块分析
for(i=0;ia[i]=0; //清除数组
for(i=0;iscanf(“%d”,&a[i]); //读取a的数据
for(i=0;iprintf(“%d”,a[i]); //输出a的数据
for(i=0;isum+=a[i]; //数组元素累加

四、字符串输入输出函数

字符串存储(赋值)
方法1:
scanf();键盘输入
char a[10];scanf(“%s”,a);
scanf(“%s”,&a);非法
注意:用%s格式输入时,遇到空格符回车符则自动结束输入
scanf(“%s,%s”,a,b);不能正确读取数据。

printf();输出
如:char s[10];
scanf(“%s”,s);输入:ab cd<回车>
printf(“%s”,s);
注意:输出时则从当前地址开始直到遇到结束符’\0’ 为止

puts()输出
格式:#include
puts(字符数组或字符串常量)
功能:在屏幕上输出字符数组中的字符。
用该函数输出与用%s格式输出一样,只是该函数将‘\0’转成’\n’
puts(“abc”);puts(“defg”);
输出结果:
abc
defg
printf(“abc”);printf(“defg”);
输出结果:
abcdefg
方法2:
gets()键盘输入
格式: #include
gets(字符数组)
功能:读取一个字符串赋给字符数组
1、用该函数输入字符时,只有遇到回车符系统才结束读取字符。
如:char str1[10];gets(str1);
输入: ab cd<回车>
str1:ab cd
2、不论是用%s还是gets()在输入时均不需要输入双引号,
若输入时用了双引号则双引号也作为字符串的有效字符。
方法3:
字符串初始化
char s[]=”abcd”;
char s[]={“abcd”};
char s[]={“abcd\0”};
char s[]={‘a’,’b’,’c’,’d’,’\0’};

五、四种字符串函数

strcat()
格式: #include
strcat(字符数组1,字符数组2)
功能:”连接”
如:
char a[18]=”jack”;
char b[10]=”zhy”;
strcat(a,b);
a => “jackzhy”
b => “zhy”
strcpy()
格式:#include
strcpy(字符数组1,字符数组2)
功能:将字符数组2中的字符串替换到字符数组1中。
函数值为字符数组1的首地址。
如:
char str1[10]=” 1234567”,str2[10]=” abc”;
strcpy(str1,str2);
str1 => “abc”
str2 => “abc”
strcmp()
格式: #include
strcmp(字符数组1,字符数组2)
功能:函数返回值相同位置不同字符的ASCLL码差值。
strcmp(“abc”,”abc”); => 0
strcmp(“abc”,”abfc”); => -3
strcmp(“abc”,”ab”); => 99
注意:不能用关系运算符直接进行字符串大小或字符数组大小的比较
如:”abc”==”abc” “abc”>”ab”
strlen()
格式:#include
strlen(字符数组)
功能:求出字符数组的实际长度(不包括结束符)
char a[10]=” 4332567”;
printf(“%d”,strlen(a)); 7

char a[]=” abc\018\0”;
printf(“%d”,strlen(a)); 5

char a[]=” abc\017\0”;
printf(“%d”,strlen(a)); 4