C语言不规则数组和指针

C语言中,不规则数组与指针是最常用的数据结构之一。不规则数组是指其内部每个一维数组的长度可能不同,而指针则可以用来访问二维及以上的数组。下面我将详细讲解不规则数组与指针的用法及其两个示例说明。

不规则数组

不规则数组可以使用嵌套的一维数组的方式来实现,示例如下:

int a[3][4] = { // 定义一个二维数组a
    {1, 2, 3, 4},
    {5, 6, 7},
    {8, 9}
}

上述代码中,数组a的第一维有3个元素,而它的第二维分别为4、3、2个元素。为了遍历这样的不规则数组,我们需要使用双重循环,其中内层循环的终止条件应该以内部一维数组的长度为依据。示例代码如下:

for(int i = 0; i < 3; ++i) { // 遍历第一维
    for(int j = 0; j < sizeof(a[i]) / sizeof(int); ++j) { // 遍历第二维
        printf("%d ", a[i][j]); // 输出数组元素
    }
    printf("\n");
}

上述代码中,内层循环通过计算数组元素的大小除以所占字节长度来计算内部一维数组长度,从而达到遍历每个内部数组的目的。

指针

除了使用不规则数组进行处理,我们还可以常用利用指针的方式来实现对不规则数组的访问。指针可以用来访问数组中的每一个元素,从而避免了对全部复杂数据类型的复制,节省了空间和时间。下面是一个通过指针访问不规则数组的示例代码:

int a[3][4] = { // 定义一个二维数组a
    {1, 2, 3, 4},
    {5, 6, 7},
    {8, 9}
};
int *p = NULL; // 声明一个指针
for(int i = 0; i < 3; ++i) { // 遍历第一维
    p = a[i]; // 让指针指向每个内部数组的第一个元素
    for(int j = 0; j < sizeof(a[i]) / sizeof(int); ++j) { // 遍历第二维
        printf("%d ", *(p++)); // 输出指针指向的每个元素,并将指针指向下一个元素
    }
    printf("\n");
}

上述代码中,我们声明了一个指针p来访问数组a的每一个元素,内部p指针的类型应该与数组元素的类型相同。此外,每次内层循环结束之前要先将p指针指向下一个元素,以便于遍历下一个元素。

示例说明

下面是两个针对不规则数组和指针的例子:

1. 不规则数组示例

假设我们需要将一个学生列表中每个学生的名字、学号、生日和成绩按照姓名字典序排序,首先我们需要将学生按照拼音字母序放到数组中,代码如下:

char *students[4][3] = { // 定义一个不规则数组
    {"Tom", "20190501", "2000.01.01"},
    {"Mary", "20190502", "1999.03.06", "89.5"},
    {"Lucy", "20190503", "2001.05.15"},
    {"David", "20190504", "2000.07.20", "75.5"}
};

上述代码定义了一个不规则数组来存放学生信息,其中每行记录了一个不定长度的学生信息。接着我们需要编写一个排序算法,按照学生的姓名来进行排序。示例代码如下:

void sort(char *students[4][3], int size) { // 排序函数,接受一个不规则数组和规则数组长度
    for(int i = 0; i < size - 1; ++i) { // 冒泡排序
        for(int j = i + 1; j < size; ++j) {
            if(strcmp(students[i][0], students[j][0]) > 0) { // 比较学生姓名字典序
                char *temp[3] = {0}; // 交换学生成绩信息
                memcpy(temp, students[i], sizeof(char *) * 3);
                memcpy(students[i], students[j], sizeof(char *) * 3);
                memcpy(students[j], temp, sizeof(char *) * 3);
            }
        }
    }
}

上述代码中,我们利用了C语言内置的标准库函数strcmp来比较学生的姓名的字典序大小,将其结合冒泡排序算法实现了对学生的姓名排序。

2. 指针示例

假设我们需要对一个内部不规则数组的每行元素进行求和,我们需要先通过指针访问这个不规则数组的每一行内部元素,然后再进行求和。示例代码如下:

int arr[3][4] = { // 定义一个二维数组
    {1, 3, 5, 7},
    {2, 4, 6},
    {9, 8}
};
int sum = 0;
for(int i = 0; i < 3; ++i) { // 遍历每一行
    int *p = arr[i]; // 定义指针p指向每一行的第一个元素
    for(int j = 0; j < sizeof(arr[i]) / sizeof(int); ++j) { // 遍历每一行的元素
        sum += *(p++); // 求和
    }
}
printf("sum=%d\n", sum);

上述代码中,我们利用了指针的特性来访问不规则数组中的每一个元素,并通过遍历求出了不规则数组中所有元素的和。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言不规则数组和指针 - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • PowerShell查看本机文件关联程序和默认打开程序的方法

    当我们在Windows系统中单击一个文件时,系统会提示我们使用哪个程序来打开这个文件。在Windows环境中,我们可以使用PowerShell来查看本机文件关联的程序和默认打开程序,下面是具体步骤: 步骤一:运行PowerShell 按下win+r,调出运行窗口,在运行窗口中输入powershell, 然后单击“确定”即可打开PowerShell。 步骤二:…

    C 2023年5月23日
    00
  • 用C语言实现2048游戏

    用C语言实现2048游戏攻略 一、游戏规则分析 2048游戏是一款数字拼图游戏,玩家通过交换数字方块来使它们相加成为2048。游戏规则如下: 游戏以一个4×4的棋盘为基础。 初始状态有两个数已知,值为2或4。 玩家每次可以选择上、下、左、右其中一方向进行滑动,若滑动时有相同数字的方块相遇,则它们将相加并合并成一个数。 每次滑动后,系统会在空白处生成一个数字,…

    C 2023年5月23日
    00
  • 基于C++实现信息管理系统

    基于C++实现信息管理系统攻略 1. 需求分析 在开始编写信息管理系统前,我们需要先对其进行需求分析。根据我们的需求分析,信息管理系统应该能够: 添加、删除、修改、查询数据 数据存储方式应该是文件存储 用户界面友好 2. 模块设计 根据需求分析,我们可以将信息管理系统分为三个模块: 数据处理模块:负责数据的增删改查等操作 文件操作模块:负责文件的读写操作 用…

    C 2023年5月23日
    00
  • C++实现蓝桥杯竞赛题目—搭积木

    C++实现蓝桥杯竞赛题目—搭积木的完整攻略 题目描述 假设你们班有很多童鞋正在参加蓝桥杯竞赛,老师突然想了个好玩的游戏:大家一起来玩搭积木,规则如下:每个学生手里都有 $n$ 个积木,编写程序按照如下规则输出: 第一行输出所有积木的高度和; 第二行将所有积木按高度升序输出; 第三行将所有积木按高度降序输出; 第四行随机输出所有积木。 程序实现 首先,因为…

    C 2023年5月23日
    00
  • C语言实现扫雷代码

    下面是“C语言实现扫雷代码”的完整攻略: 1. 设计数据结构 在扫雷游戏中,我们需要用到以下数据结构: 1.1 格子(Cell) 每一个格子有一个横坐标、一个纵坐标,以及一个当前状态(未打开、已标记、已揭开)和一个值(0 – 8代表周围8个格子中地雷的数量,9代表该格子本身就是地雷)。 struct Cell { int x; // 横坐标 int y; /…

    C 2023年5月23日
    00
  • C语言实现求定积分的方法

    C语言实现求定积分的方法 在C语言中实现求定积分的方法可以采用数值积分的方式,其中常用的方法有梯形法、辛普生法和龙贝格法。 梯形法 梯形法是最简单的数值积分方法之一,具体实现步骤如下: 将积分区间[a,b]分成n个小区间,每个小区间宽度为h=(b-a)/n。 计算每个小区间左右两端点的函数值后求平均值,得到该小区间的梯形面积。 将所有小区间梯形面积相加,得到…

    C 2023年5月22日
    00
  • Python中Random和Math模块学习笔记

    当谈到随机数生成,Python自带的random模块和math模块是帮助我们处理这些任务的重要组件。这两个库都允许我们使用Python进行随机数生成操作,它们之间也存在着一些区别,下面我来详细讲解一下这两个模块的使用。 Random模块 Random模块是Python自带的标准库之一,可以用于生成随机数和从序列中作出随机选择。下面是一个简单的示例,展示了如何…

    C 2023年5月22日
    00
  • MYSQL数据库Innodb 引擎mvcc锁实现原理

    MYSQL数据库Innodb 引擎mvcc锁实现原理 InnoDB是MySQL数据库的默认存储引擎,实现了被广泛使用的多版本并发控制(MVCC)锁机制,这使得InnoDB的并发处理能力比其他存储引擎更优秀。本文将重点讲解InnoDB的MVCC锁实现原理。 MVCC介绍 MVCC为多版本并发控制(Multi-Version Concurrency Contro…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部