🌟 各位看官好,我是maomi_9526!
🌍 种一棵树最好是十年前,其次是现在!
🚀 今天来学习C语言的相关知识。
👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦
目录
1. 数组的概念
数组是一种数据结构,用于存储多个相同类型的元素。每个元素都通过一个下标进行索引。数组的大小在定义时固定,无法动态改变。数组的主要特点是存储空间连续且可以通过索引直接访问元素。
数组的特点:
- 元素类型相同:数组中的所有元素必须是同一数据类型,例如,所有元素可以是
int、float或char等。 - 内存连续性:数组在内存中是连续存储的,因此可以通过计算偏移量快速访问。
- 索引从0开始:数组的下标从0开始,元素位置为
arr[0]、arr[1],直到arr[n-1],其中n是数组的大小。
数组的优点:
- 随机访问:可以通过下标快速访问数组的任意元素。
- 空间连续性:由于数组在内存中是连续存储的,这使得数组的访问速度较快。
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
printf("第一个元素: %d\n", arr[0]); // 输出 1
printf("第三个元素: %d\n", arr[1]); // 输出 2
return 0;
}
2. 数组的创建与初始化
2.1 数组的创建
数组的创建需要指定其类型和大小。大小通常是一个常量值,且在创建数组时就必须确定。
数组声明语法:
type arr_name[size];
其中:
type为数组元素的类型(例如int、float等)。arr_name是数组的名字,通常采用有意义的名称。size是数组的大小,指定数组可以容纳多少个元素。
实例:
int arr[10]; // 声明一个包含10个整数的数组
2.2 数组初始化
数组初始化是指在声明数组时同时为其元素赋予初值。可以选择完全初始化、部分初始化或不初始化。
- 完全初始化:在声明时为每个元素赋一个初值。
int arr[5] = {1, 2, 3, 4, 5};
- 不完全初始化:未明确赋值的元素会自动初始化为零。
int arr[6] = {1}; // arr[0] = 1,其他为0
- 初始化错误:如果给数组初始化的元素超过了数组的大小,就会发生错误。
int arr[3] = {1, 2, 3, 4}; // 错误:元素过多
实例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2}; // 初始化前两个元素,其他为0
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
输出:
1 2 0 0 0
3. 数组的使用
3.1 数组下标
数组下标是从0开始的整数,arr[0]表示数组的第一个元素,arr[1]表示第二个元素,以此类推。可以通过数组下标直接访问数组中的元素。
示例:
int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", arr[3]); // 输出 4
3.2 数组遍历
可以使用for循环遍历数组并打印每个元素。数组的大小可以通过手动指定或使用sizeof来计算。
示例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
输出:
1 2 3 4 5
3.3 数组输入
可以通过scanf函数为数组中的每个元素赋值。注意,在输入数据时需要确保输入的类型与数组元素类型一致。
示例:
#include <stdio.h>
int main() {
int arr[5];
printf("请输入5个整数:\n");
for (int i = 0; i < 5; i++) {
scanf("%d", &arr[i]);
}
printf("你输入的数组是: ");
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
4. sizeof运算符计算数组大小
sizeof是C语言中的一个运算符,可以用于获取数组或类型的大小。通过sizeof,可以计算数组的总大小并确定数组中元素的个数。
计算数组元素个数:
#include <stdio.h>
int main() {
int arr[10] = {0};
int num_elements = sizeof(arr) / sizeof(arr[0]);
printf("数组元素个数: %d\n", num_elements);
return 0;
}
输出:
数组元素个数: 10
5. 二维数组的创建与初始化
5.1 创建二维数组
二维数组是一个包含多个一维数组的数组。创建二维数组时,需要指定行数和列数。数组元素通过两个下标来访问,分别表示行和列。
二维数组的声明语法:
type arr_name[行数][列数];
实例:
int arr[3][4]; // 创建一个3行4列的二维数组
5.2 数组初始化
- 完全初始化:
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
- 按行初始化:
int arr[2][3] = {{1, 2}, {3, 4}};
- 省略行数:
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
示例:
#include <stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
输出:
1 2 3
4 5 6
6. 数组在内存中的存储
6.1 数组的内存存储
数组的元素在内存中是连续存储的,这意味着数组中元素的内存地址是连续的,且每个元素所占内存大小相同。数组的内存地址是通过数组名来间接访问的。
一维数组的内存布局:
- 数组的每个元素都位于内存中的相邻位置,元素之间的地址差等于每个元素的大小。
- 例如,对于一个
int类型的数组,若每个元素占4字节,那么每两个元素之间的地址相差4字节。
示例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("arr[%d] 的地址: %p\n", i, (void*)&arr[i]);
}
return 0;
}
二维数组的内存布局:
- 二维数组在内存中也是按行连续存储的。首先存储第一行的所有元素,然后存储第二行,以此类推。
7. C99中的变长数组
C99标准引入了变长数组(VLA),允许在程序运行时动态确定数组的大小。这种特性增强了数组的灵活性,使其能够根据用户输入或运行时条件确定大小。
变长数组的特点:
- 数组的大小在运行时确定,而不是在编译时。
- 变长数组的大小必须在栈内存中分配,因此大小不能过大。
示例:
#include <stdio.h>
int main() {
int n;
printf("请输入数组大小: ");
scanf("%d", &n);
int arr[n]; // 数组大小由用户输入决定
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}


1265

被折叠的 条评论
为什么被折叠?



