在C语言中,数组是一种数据结构,用于存储一组相同类型的数据。数组在内存中是连续存储的,因此可以通过索引访问每个元素。以下是C语言数组的详细讲解:
1. 数组的定义
数组是具有相同数据类型的多个数据元素的集合。每个元素通过一个索引(下标)标识。
定义语法:
<数据类型> 数组名[大小];
示例:
int numbers[5]; // 定义一个存储5个整数的数组
2. 数组的初始化
2.1 声明时初始化
在声明数组时,可以直接为其赋初值。
示例:
int numbers[5] = {1, 2, 3, 4, 5}; // 初始化数组所有元素
int values[5] = {1, 2}; // 未显式初始化的元素默认值为0
特殊情况:
省略大小,编译器根据初值数量自动推断数组大小。
int numbers[] = {10, 20, 30}; // 自动推断为大小为3的数组
2.2 动态赋值
可以先声明数组,随后逐个元素赋值。
int numbers[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
3. 访问数组元素
通过数组名和索引访问元素:
数组名[索引]
- 索引从 0 开始。
- 超过数组边界的索引会导致未定义行为(可能崩溃或访问其他内存)。
示例:
#include <stdio.h>
int main() {
int numbers[3] = {10, 20, 30};
printf("Element at index 0: %d\n", numbers[0]); // 输出10
printf("Element at index 1: %d\n", numbers[1]); // 输出20
return 0;
}
4. 数组的特点
- 同一类型:数组中的所有元素类型必须相同。
- 连续存储:数组元素在内存中是连续存储的。
- 固定大小:数组大小一旦定义,就不可更改(除非使用动态分配)。
- 随机访问:可以通过索引直接访问任意元素。
5. 数组的内存分布
假设有以下数组:
int numbers[3] = {10, 20, 30};
假设 numbers
的起始地址为 0x1000
,每个 int
占用 4 字节:
索引 | 值 | 内存地址 |
---|---|---|
numbers[0] | 10 | 0x1000 |
numbers[1] | 20 | 0x1004 |
numbers[2] | 30 | 0x1008 |
通过数组名(如 numbers
)可以获取数组的首地址。
6. 数组操作
6.1 遍历数组
使用循环遍历数组:
#include <stdio.h>
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("Element at index %d: %d\n", i, numbers[i]);
}
return 0;
}
6.2 修改数组元素
直接通过索引访问并修改:
numbers[2] = 99; // 将索引2的元素修改为99
7. 字符数组与字符串
字符数组用于存储字符串,字符串以 '\0'
(空字符) 结尾。
字符数组定义:
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
也可以直接初始化字符串:
char str[] = "Hello"; // 自动添加 '\0'
字符数组操作:
输出字符串:
#include <stdio.h>
int main() {
char str[] = "Hello, World!";
printf("%s\n", str); // 输出完整字符串
return 0;
}
遍历字符串:
#include <stdio.h>
int main() {
char str[] = "C Programming";
for (int i = 0; str[i] != '\0'; i++) {
printf("Character at index %d: %c\n", i, str[i]);
}
return 0;
}
8. 多维数组
定义:
<数据类型> 数组名[行数][列数];
示例:
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
访问多维数组:
通过两个索引访问:
printf("%d\n", matrix[0][1]); // 输出2
遍历多维数组:
#include <stdio.h>
int main() {
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("Element at [%d][%d]: %d\n", i, j, matrix[i][j]);
}
}
return 0;
}
9. 数组与指针的关系
数组名可以看作是数组首元素的指针。
示例:
#include <stdio.h>
int main() {
int numbers[3] = {10, 20, 30};
printf("Address of numbers: %p\n", numbers); // 输出数组首地址
printf("Address of numbers[0]: %p\n", &numbers[0]); // 与上述相同
return 0;
}
可以通过指针访问数组:
int *ptr = numbers;
printf("%d\n", *(ptr + 1)); // 输出20
10. 常见问题
10.1 数组越界
访问超出数组范围的索引会导致未定义行为。
int numbers[3] = {1, 2, 3};
printf("%d\n", numbers[5]); // 错误:越界访问
10.2 数组大小
获取数组的元素个数:
int numbers[5];
int size = sizeof(numbers) / sizeof(numbers[0]);
11. 应用示例
求数组中最大值:
#include <stdio.h>
int main() {
int numbers[] = {10, 20, 5, 40, 30};
int max = numbers[0];
for (int i = 1; i < 5; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
}
printf("Maximum value: %d\n", max);
return 0;
}
如果你对数组有更多疑问或需要具体的代码示例,欢迎提问!
标签:元素,数组,int,讲解,索引,numbers,详细,printf From: https://blog.csdn.net/2401_88186301/article/details/144440353