数组属于一种构造类型,其中的变量被称为数组的元素。
数组元素的类型可以是基本数据类型,也可以是特殊类型和构造类型。
(一)一维数组
1.定义形式如下
类型说明符 数组名[常量表达式]
其中,类型说明符是数组中每个元素的类型,常量表达式是数组元素的个数。
2.注意事项:
- 常量表达式的值必须是正整数
- 数组元素的引用,数组的起始元素下标为0
示例1:
#include<stdio.h>
#define N 9
int main(void) {
int arr[N];
int i;
for (i = 0; i < N; i++){
arr[i] = i + 1;
printf("arr[%d]=%d\t", i, arr[i]);
if (0 == (i+1)%3){ //换行条件
printf("\n");
}
}
return 0;
}
运行结果
arr[0]=1 arr[1]=2 arr[2]=3
arr[3]=4 arr[4]=5 arr[5]=6
arr[6]=7 arr[7]=8 arr[8]=9
2 3 5 7 9
2 3 5 7 9
输出的逆向数组如下:
9 7 5 3 2
示例2:
使用数组保存用户输入的数据,当输入完毕后逆向输出代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define N 5
int main(void) {
int arr[N];//定义数组
int i, temp;//定义变量
//输入一个5个元素数组:
for (i = 0; i < N; i++){
scanf("%d", &arr[i]);
}
//读取到的数组如下
for (i = 0; i < N; i++){
printf("%d ",arr[i]);
}
printf("\n");
for (i=0;i<2;i++){ //将数组中元素的前后位置互换
temp = arr[i];
arr[i] = arr[4 - i];
arr[4 - i] = temp;
}
printf("输出的逆向数组如下:\n");
for (i = 0; i < N; i++){
printf("%d ", arr[i]);
}
return 0;
}
运行结果
2 3 5 7 9
2 3 5 7 9
输出的逆向数组如下:
9 7 5 3 2
(二)二维数组
1.定义形式如下
类型说明符 数组名[常量表达式1]
[常量表达式2]
其中,常量表达式1为第一维的长度,常量表达式2为第二维的长度。
2,注意事项
通常在处理二维数组的时候,为了便于理解,将数组视为一个矩阵,常量表达式1表示矩阵的行数,而常量表达式2表示矩阵的列数。
与一维数组一样,在定义二维数组时,常量表达式同样不能为变量。
示例1:
#include<stdio.h>
int main(){
int arr[4][3]={0};
int i,j;
//读入数据
for(i=0;i<4;i++){
for(j=0;j<3;j++){
scanf("%d",&arr[i][j]);
}
}
//输出数据
for(i=0;i<4;i++){
for(j=0;j<3;j++){
printf("&arr[%d][%d]=%d\t",i,j,arr[i][j]);
}
printf("\n");
}
return 0;
}
运行结果
4 4 4
5 5 5
6 6 6
4 4 4
&arr[0][0]=4 &arr[0][1]=4 &arr[0][2]=4
&arr[1][0]=5 &arr[1][1]=5 &arr[1][2]=5
&arr[2][0]=6 &arr[2][1]=6 &arr[2][2]=6
&arr[3][0]=4 &arr[3][1]=4 &arr[3][2]=4
示例2:
任意输入一个3行3列的二维数组,求对角元素之和
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int arr[3][3];
int i, j, sum = 0;
printf("please input:\n");
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < 3; i++){
for ( j = 0; j < 3; j++){
if (i==j){
sum += arr[i][j];
}
}
}
printf("the result is: %d\n", sum);
return 0;
}
运行结果
please input:
1 2 3
4 5 6
5 4 3
the result is: 9
(三)字符数组
1.定义形式如下
char 数组名[常量表达式];
其中,常量表达式是数组元素的个数。
2.注意事项
字符数组顾名思义就是数组的元素类型为字符型的数组。特殊之处在于它是数组元素为字符的数组。
其定义的一般形式是char。并不是说类型说明符只能是char,也可以是long、int等,
由于char型只占用一个字节的大小,使用long型和int型来定义字符数组会造成资源的浪费,因此一般选择使用char型来定义字符数组,选用char型作为数组类型避免了内存空间的浪费。
示例1:
#include<stdio.h>
#define SIZE 20
int main(){
long arr1[SIZE]={'h','e','l','l','o',' ','w','o','r','l','d','!'};
char arr2[SIZE]={ 'h','e','l','l','o',' ','w','o','r','l','d','!' };
printf("long型字符数组占用的内存大小为:%d\n", sizeof(arr1));
printf("char型字符数组占用的内存大小为:%d\n", sizeof(arr2));
return 0;
}
运行结果
long型字符数组占用的内存大小为:80
char型字符数组占用的内存大小为:20
示例2:
#include<stdio.h>
#define SIZE 20
int main(){
char arr[SIZE]={ 'h','e','l','l','o',' ','w','o','r','l','d','!' };
int i;
for (i = 0; i < SIZE; i++){
printf("%c", arr[i]);
}
return 0;
}
运行结果
hello world!
运行结果为“Hello World!”,其中有一些空字符。
看看上面代码中定义的arr数组,其数组长度为20,而初始化的字符元素的个数为12,初始化的字符元素个数小于数组长度,编译器在编译过程中将后面没有初始化的数组元素赋值为‘\0’,这也正是打印输出中含有空字符的原因。在打印的时候也可以将数组中的元素‘\0’视为数组结束的标志,例如:
#include<stdio.h>
#define SIZE 20
int main() {
int i;
long arr[SIZE] = { 'h','e','l','l','o',' ','w','o','r','l','d','!' };
for (i = 0; arr[i]!='\0'; i++){
printf("%c", arr[i]);
}
return 0;
}
这时的输出结果中就不含有任何空字符了,因为巧妙地使用了字符数组中的‘\0’标志。
也可以采用字符串常量的方式来对一维字符数组进行初始化,例如:
#include<stdio.h>
#define SIZE 20
int main() {
int i;
char arr[SIZE] = { "hello world!" };
for (i = 0; arr[i] != '\0'; i++){
printf("%c", arr[i]);
}
return 0;
}
在对一维字符数组进行定义和初始化的过程中,可以不指定其长度。
在使用字符常量列表和字符串常量的方式进行初始化时,各自的结果是不同的,例如:
#include<stdio.h>
int main(){
int i;
char arr1[] = { "hello world!" };
char arr2[] = {'h','e','l','l','o',' ','w','o','r','l','d','!'};
printf("采用字符串常量进行初始化的arr1数组的长度为:%d\n", sizeof(arr1));
printf("采用字符常量列表进行初始化的arr2数组的长度为:%d\n", sizeof(arr2));
return 0;
}
运行结果
采用字符串常量进行初始化的arr1数组的长度为:13
采用字符常量列表进行初始化的arr2数组的长度为:12
从运行结果可知,采用这两种方式得到的数组长度并不相同。
采用字符串常量对字符数组进行初始化时,在内存中进行存储时会自动在字符串的后面添加一个结束符‘\0’,所以得到的字符数组长度是字符串常量的长度加1;
采用字符常量列表的方式对字符数组进行初始化就不会在最后添加一个结束符。
所以采用字符常量定义的字符数组的长度就是字符常量列表中字符的个数。
------------------END------------------