1,040
社区成员




目录
数组是一组相同类型元素的集合,这些元素在内存中连续存储。数组可以是一维的,也可以是多维的,常见的是一维数组和二维数组。在C语言中,数组是通过指定类型、数组名和元素个数来创建的。
一维数组的创建语法如下:
type arr_name[常量值];
其中,type
指定数组中存放的数据类型,可以是char
、short
、int
、float
等,也可以是自定义的类型。arr_name
是数组的名字,可以根据需要任意取。[常量值]
指定的是数组中元素的个数。
数组的初始化就是给定数组中元素的初始值,可以完全初始化也可以不完全初始化。
完全初始化:
int arr[5] = {1, 2, 3, 4, 5};
此时,数组中的每个元素都被赋予了初始值。
不完全初始化:
int arr[5] = {1, 2, 3};
此时,只有前三个元素被初始化,剩下的元素默认初始化为0。即arr[0] = 1
, arr[1] = 2
, arr[2] = 3
, arr[3] = 0
, arr[4] = 0
。
不指定长度,通过大括号内元素个数确定数组长度:
int arr[] = {1, 2, 3, 4, 5};
此时,数组的长度由大括号内的元素个数确定。
错误的初始化:
int arr[5] = {1, 2, 3, 4, 5, 6};
这是错误的,因为大括号内的元素个数大于数组定义时的长度。
C语言规定数组是有下标的,下标从0开始。假设数组有n个元素,最后一个元素的下标是n-1。例如,对于数组int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
,要访问下标为7的元素,可以使用arr[7]
。
可以使用for循环来遍历数组并打印每个元素的值。例如:
#include <stdio.h>
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
同样,可以使用for循环来向数组中输入数据。例如:
#include <stdio.h>
int main() {
int arr[10];
for (int i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
数组在内存中是连续存放的。可以通过打印数组元素的地址来验证这一点。例如:
#include <stdio.h>
int main() {
int arr[10] = {0};
for (int i = 0; i < 10; i++) {
printf("%p\n", &arr[i]);
}
return 0;
}
从输出结果可以看出,随着下标的增长,地址越来越大,且每两个相邻地址的差等于一个整型变量所占的字节数(通常为4个字节)。
sizeof计算数组元素个数
在遍历数组的时候,往往需要知道数组元素的个数。这时可以使用sizeof
运算符来计算数组的大小,然后除以单个数组元素的大小来得到元素个数。例如:
#include <stdio.h>
int main() {
int arr[10] = {0};
int len = sizeof(arr) / sizeof(arr[0]);
printf("%d", len);
return 0;
}
二维数组的创建语法如下:
type arr_name[常量值1][常量值2];
其中,type
指定数组中存放的数据类型,arr_name
是数组的名字,[常量值1]
和[常量值2]
分别指定数组的行数和列数。
不完全初始化:
int arr[3][5] = {1, 2};
此时,只有第一行的前两个元素被初始化,剩下的元素默认初始化为0。
完全初始化:
int arr[3][5] = {
{1, 2, 3, 4, 5},
{2, 3, 4, 5, 6},
{3, 4, 5, 6, 7}
};
此时,数组的每个元素都被赋予了初始值。
按照行初始化:
int arr[3][5] = {{1, 2}, {3, 4}, {5}};
此时,每一行都被当作一个独立的数组来初始化,未初始化的元素默认初始化为0。
行可以省略:
int arr[][5] = {1, 2, 3, 4, 5, 6, 7};
此时,可以不指定行数,但一定要指定列数,否则编译器无法确定每行有多少元素。
二维数组的访问也使用下标形式,通过行号和列号来唯一确定数组中的一个元素。例如,对于数组int arr[3][5] = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}};
,要访问第二行第四列的元素,可以使用arr[1][3]
。
可以使用嵌套的for循环来向二维数组中赋值和遍历。例如:
#include <stdio.h>
int main() {
int arr[3][5] = {0};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
scanf("%d", &arr[i][j]);
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
字符数组是由一个一个的字符组成的数组。例如:
char arr1[5] = {'H', 'e'};
char arr2[8] = {'a', 98};
字符串是由双引号引起来的一串字符。字符串的结束标志是一个\0
的转义字符,在计算字符串长度时\0
不算作字符串的内容。例如:
char arr1[] = "Jack";
char arr2[] = {'J', 'a', 'c', 'k'};
printf("%s\n", arr1);
printf("%s\n", arr2);
可以使用scanf
函数从键盘输入字符数组(字符串)。例如:
#include <stdio.h>
int main() {
char name[256] = {0};
printf("please input name:");
scanf("%s", name);
printf("