C语言数据结构:数组

ops/2025/3/15 4:03:01/

1. 数组(Array)


1.1 定义

数组是一种线性数据结构,由相同类型的元素组成,这些元素在内存中按顺序存储。数组的大小在声明时确定,且不可动态改变。


1.2 类型细分

根据维度和用途,数组可以分为以下几种类型:

1.2.1 一维数组

定义:一维数组是最简单的数组形式,元素按线性顺序排列。
语法

int arr[10]; // 声明一个包含10个整数的数组

使用场景:存储线性数据,如学生成绩、温度记录等。
使用案例

int scores极[5] = {90, 85, 78, 92, 88};
for (int i = 0; i < 5; i++) {printf("Score %d: %d\n", i + 1, scores[i]);
}
1.2.2 多维数组

定义:多维数组数组数组,最常见的是二维数组(矩阵)。
语法

int matrix[3][3]; // 声明一个3x3的二维数组

使用场景:存储表格数据、图像像素、矩阵运算等。
使用案例

int matrix[2][2] = {{1, 2}, {3, 4}};
for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {printf("%d ", matrix[i][j]);}printf("\n");
}
1.2.3 字符数组

定义:字符数组用于存储字符串,以\0(空字符)结尾。
语法

char str[10]; // 声明一个最多存储9个字符的字符串

使用场景:存储和处理字符串,如姓名、地址等。
使用案例

char name[20] = "John Doe";
printf("Name: %s\n", name);
1.2.4 动态数组

定义:动态数组的大小在运行时确定,通常使用指针和malloc函数实现。
语法

int *arr = (int *)malloc(10 * sizeof(int)); // 动态分配10个整数的空间

使用场景:当数组大小在编译时未知时使用,如读取用户输入的数据。
使用案例

int n;
printf("Enter array size: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {arr[i] = i + 1;
}
free(arr); // 释放内存

1.3 使用场景

固定大小数据存储:如存储学生成绩、温度记录等。
矩阵运算:如存储和操作二维矩阵。
字符串处理:如存储和操作字符串。
动态数据存储:如读取用户输入的数据。


1.4 区别

No.类型特点
1一维数组线性存储,适用于简单数据集合。
2多维数组数组数组,适用于表格或矩阵数据。
3字符数组用于存储字符串,以\0结尾。
4动态数组大小在运行时确定,灵活但需要手动管理内存。

1.5 使用注意事项

  1. 数组越界:访问数组时需确保索引在合法范围内,否则会导致未定义行为。
    int arr[5];
    arr[5] = 10; // 错误:索引越界
    
  2. 初始化:未初始化的数组可能包含垃圾值,需手动初始化。
    int arr[5] = {0}; // 初始化为0
    
  3. 内存管理:动态数组使用malloc分配内存后,需使用free释放内存。
    int *arr = (int *)malloc(10 * sizeof(int));
    free(arr); // 释放内存
    
  4. 字符数组与字符串:字符数组存储字符串时需预留\0的位置。
    char str[6] = "Hello"; // 正确
    char str[5] = "Hello"; // 错误:未预留`\0`的位置
    
  5. 多维数组的存储顺序:多维数组在内存中是按行优先顺序存储的。

1.6 实例详细说明(包含地址分配)

1.6.1 一维数组的地址分配
#include <stdio.h>int main() {int arr[3] = {10, 20, 30};printf("Array elements and their addresses:\n");for (int i = 0; i < 3; i++) {printf("arr[%d] = %d, Address: %p\n", i, arr[i], &arr[i]);}return 0;
}

输出

Array elements and their addresses:
arr[0] = 10, Address: 0x7ffee4b4c9fc
arr[1] = 20, Address: 0x7ffee4b4ca00
arr[2] = 30, Address: 0x7ffee4b4ca04

说明:一维数组的元素在内存中连续存储,每个元素占用的地址间隔为sizeof(int)(通常为4字节)。

1.6.2 二维数组的地址分配
#include <stdio.h>int main() {int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};printf("Matrix elements and their addresses:\n");for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {printf("matrix[%d][%d] = %d, Address: %p\n", i, j, matrix[i][j], &matrix[i][j]);}}return 0;
}

输出

Matrix elements and their addresses:
matrix[0][0] = 极1, Address: 0x7ffee4b4c9f0
matrix[0][1] = 2, Address: 0x7ffee极4b4c9f4
matrix[0][2] = 3, Address: 0x7ffee4b4c9f8
matrix[1][0] = 4, Address: 0x7ffee4b4c9fc
matrix[1][1] = 5, Address: 0x7ffee4b4ca00
matrix[1][2] = 6, Address: 0x7ffee4b4ca04

说明:二维数组在内存中按行优先顺序存储,地址连续。

1.6.3 字符数组的地址分配
#include <stdio.h>int main() {char str[] = "Hello";printf("String elements and their addresses:\n");for (int i = 0; i < 6; i++) { // 包括'\0'printf("str[%d] = '%c', Address: %p\n", i, str[i], &str[i]);}return 0;
}

输出

String elements and their addresses:
str[0] = 'H', Address: 0x7ffee4b4c9f0
str[1] = 'e', Address: 0x7ffee4b4c9f1
str[2] = 'l', Address: 0x7ffee4b4c9f2
str[3] = 'l', Address: 0x7ffee4b4c9f3
str[4] = 'o', Address: 0x7ffee4b4c9f4
str[5] = '\0', Address: 0x7ffee4b4c9f5

说明:字符数组在内存中连续存储,每个字符占1字节。

1.6.4 动态数组的地址分配
#include <stdio.h>
#include <stdlib.h>int main() {int n = 3;int *arr = (int *)malloc(n * sizeof(int));for (int i = 0; i < n; i++) {arr[i] = i + 1;}printf("Dynamic array elements and their addresses:\n");for (int i = 0; i < n; i++) {printf("arr[%d] = %d, Address: %p\n", i, arr[i], &arr[i]);}free(arr);return 0;
}

输出

Dynamic array elements and their addresses:
arr[0] = 1, Address: 0x7f9d7ac02a80
arr[1] = 2, Address: 0x7f9d7ac02a84
arr[2] = 3, Address: 0x7f9d7ac02a88

说明:动态数组在内存中连续存储,地址间隔为sizeof(int)


总结

数组是C语言中非常基础且重要的数据结构,适用于各种数据存储和处理场景。在使用时,需注意数组的大小、索引范围以及内存管理,以避免常见的错误。通过地址分配的分析,可以更好地理解数组在内存中的存储方式。


http://www.ppmy.cn/ops/165837.html

相关文章

Spring BOOT 启动参数

Spring BOOT 启动参数 在Java Web的开发完成后&#xff0c;以前我们都会打包成war文件&#xff0c;然后放大web容器&#xff0c;比如tomcat、jetty这样的容器。现在基于SpringBoot开发的项目&#xff0c;我们直接打包成jar文件&#xff0c;基于内嵌的tomcat来实现一样的效果。…

蓝桥杯第三天:2023蓝桥杯省赛 第 1 题

1、总价格要开 long 数据类型 2、直接贪心就行&#xff08;优先找当前价格最贵的两个&#xff0c;然后再找当前能赠的价格最高的&#xff09;&#xff0c;找赠品的时候记得用二分&#xff08;不然超时&#xff09; 3、贪心不总是能找到最优解&#xff0c;但不能找最优解的情况…

数组逆序重存放(信息学奥赛一本通-1105)

【题目描述】 将一个数组中的值按逆序重新存放。例如&#xff0c;原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。 【输入】 两行&#xff1a;第一行数组中元素的个数n&#xff08;1<n<100)&#xff0c;第二行是n个整数&#xff0c;每两个整数之间用空格分隔。 【输出】 一行…

Haskell爬虫:为电商运营抓取京东优惠券的实战经验

一、需求分析&#xff1a;为什么抓取京东优惠券&#xff1f; 京东作为中国领先的电商平台之一&#xff0c;拥有海量的商品和丰富的优惠券资源。这些优惠券信息对于电商运营者来说具有极高的价值。通过分析竞争对手的优惠券策略&#xff0c;运营者可以更好地制定自己的促销方案…

DAY33 贪心算法Ⅱ

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 想到把整体利润分解为每天的利润&#xff0c;就豁然开朗了。 class Solution { public:int maxProfit(vector<int>& prices) {int result0;for(int i1;i<prices.size();i){resultmax(0,pric…

idea更新git代码报错No Git Roots

idea更新git代码报错&#xff1a; No Git Roots None of configured Git roots are under Git. The configured directory must have ".git directory in it.但是本地项目里是存在.git文件的&#xff0c;就是突然间不能更新代码了 然后尝试重新拉新项目代码提示: Git i…

初阶数据结构(C语言实现)——5.3 堆的应用(1)——堆排序

目录 1 堆的应用1.1 堆排序1.1.1 思路1.1.2 代码实现 1.2 建堆的时间复杂度1.2.1 向下调整1.2.1 向上调整1.2.3 结论 学习堆的应用之前&#xff0c;欢迎学习下堆。 这是博主之前的文章&#xff0c;欢迎学习交流 初阶数据结构&#xff08;C语言实现&#xff09;——5.2 二叉树的…

hadoop集群配置-rsync命令

rsync主要用于备份和镜像 在100中新建文件夹 在conf中新建四个文件 输入命令&#xff1a; rsync -av conf/ roothadoop101:/opt/conf/