数组是一组相同类型的有序数据的集合,用一个数组名标识。
一维数组用于存储一行或一列数据。
定义一维数组的一般形式如下:
类型说明符 数组名[数组长度]
其中,数组的长度表示数组元素的总个数。
例如:
int a[5];
表示定义一个名为a的数组,数组是一维的,共有5个元素,每个元素都是int类型。
5个元素为a[0]~a[4],方括号中的数字为下标,表示元素在数组中的序号。
系统在内存中为数组分配的是连续的存储空间,数组元素在内存中连续存放。
一维数组在内存中的存储方式为整个数组占用一段连续的内存单元,各元素按顺序依次存放。
数组名表示数组所占用的内存空间的开始处的地址,该地址称为数组的首地址或起始地址。
数组的初始化是指在定义数组的同时为数组元素赋初值,下面列举几种不同的赋初值情况:
int a[5]={1,2,3,4,5}; //给数组的全部元素赋初值
int a[5]={1,2}; //给数组的部分元素赋初值
int a[4]={1,2,3,4,5}; //这是错误的,初值个数不能超过数组长度
int a[]={1,2,3,4,5}; //在给数组的全部元素赋初值时允许省略数组长度的说明
/*自动局部数组*/
int a[5]; //a数组未做初始化,它的5各元素都是系统给的随机数
a[0]=1; a[1]=2; //将a[0]和a[1]分别赋值1和2,后面3各元素未变仍是随机数
数组分为全局数组和局部数组,局部数组又分为自动数组和静态数组。
全局数组和静态局部数组如果在定义时未赋初值,对于数值型数组,系统将所有元素初始化为零。
自动局部数组如果在定义时未赋初值,系统将所有元素初始化为随机数。
下面写一个简单的冒泡法升序排序算法。
#include <stdio.h>
int main() {
int n, N, i;
printf("输入需要排序的元素总个数:");
scanf("%d", &N);
int a[N], t;
for (n = 0; n < N; n++) {
printf("输入第%d个元素的值:", n + 1);
scanf("%d", &a[n]);
}
for (n = 0; n < N - 1; n++) {
for (i = 0; i < N - 1; i++) {
if (a[i] > a[i + 1]) {
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
printf("按升序排序:");
for (n = 0; n < N; n++) {
if (n < N - 1)
printf("%d,", a[n]);
else
printf("%d", a[n]);
}
return 0;
}
输出结果。
二维数组用于存储逻辑上按行、列组织在一起的数据。
定义二维数组的一般形式如下:
类型说明符 数组名[常量表达式1][常量表达式2]
例如:
int a[3][2]
a数组的各个元素分别为:
a[0][0] a[0][1]
a[1][0] a[1][1]
a[2][0] a[2][1]
第1个下标表示元素所在行,称为行下标;第2个下标表示元素所在列,称为列下标。
二维数组可以看作是一种特殊的一维数组。
由于内存本身是一种线性结构,因此二维数组在内存中的存储空间是连续的线性空间。
在内存中,二维数组按行存放,先存放第1行的元素,再存放第2行的元素,以此类推。
例如:
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
无论是一维数组还是二维数组,数组名都表示其存储空间的首地址。
字符型数组的定义方法与数值型数组类似,只是类型为char。
例如:
char a[5] = {'h', 'e', 'l', 'l', 'o'}; //用字符初始化
/*用字符串初始化*/
char a[6] = {"hello"};
char a[6] = "hello";
char a[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
字符串是用双引号引起来的一串字符。
在字符串末尾系统会自动添加一个字符串结束标志'\0',表示字符串在此位结束。
'\0'是ASCII码值是0的字符,称为空字符,它不作为字符串的有效字符,只起辨识的标志作用,但它要占用1字节的内存空间。
初始化时如果只提供了部分元素的值,未提供初值的元素自动取值为'\0'。
下面写一个简单程序,对比在使用scanf或printf函数时,”%c“和“%s”的差异。
使用"%c"时,例如:
#include <stdio.h>
int main() {
char a[30];
int i = -1;
do {
i++;
scanf("%c", &a[i]);
} while (a[i] != '\n');
a[i] = '\0';
for (i = 0; a[i] != '\0'; i++) {
printf("%c", a[i]);
}
printf("\n");
return 0;
}
输入与输出的结果。
使用“%s”时,例如:
#include <stdio.h>
int main() {
char a[30];
scanf("%s", a); //注意数组名a,前无‘&’,后无‘[]’
printf("%s", a);
return 0;
}
输入与输出的结果。
在使用“%s”格式说明符输入字符串时,系统会在接收进来的字符串末尾自动添加一个‘/0’,将字符串连同添加的'/0'一并存入数组。
在使用“%s”格式说明符输入字符串时,遇到空格或回车就认为该字符串输入结束。
字符串输入函数gets,该函数的调用形式如下:
gets(字符数组名)
其功能是将从键盘输入的一个字符串存到指定数组中。字符串可以包含空格,输入时以回车结束,将字符串存入数组时连同字符串结束标志'\0'一同存入。
字符串输出函数puts,该函数的调用形式如下:
puts(字符数组名或字符串常量)
其功能是输入一个字符串,遇到'\0'时结束输出,输出后自动换行。
写一个简单的程序,例如:
#include <stdio.h>
int main() {
char a[30];
printf("输入");
gets(a);
puts("这是输入的字符串:");
puts(a);
printf("\n");
puts("ABC\nDE\0FGHIJKL");
return 0;
}
输入和输出的结果。