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日

相关文章

  • C++代码实现学生信息管理系统

    C++代码实现学生信息管理系统 本文将详细讲解如何使用C++代码实现学生信息管理系统。该系统可以进行学生信息的增删查改等简单操作,并使用文件进行数据持久化。 1. 确定系统需求 首先需要明确需要实现哪些功能,包括但不限于:- 添加学生信息- 修改学生信息- 删除学生信息- 查询学生信息- 显示学生信息列表 2. 确定数据结构 根据需求,我们可以选择使用结构体…

    C 2023年5月23日
    00
  • Go json反序列化“null“的问题解决

    当使用Go语言进行json反序列化时,可能会遇到null值的问题。在这种情况下,Go的json解析器会将null值解析为零值,而不是空值。 要解决这个问题,有两种方法: 方法一:使用指针类型 可以将解析结果存储在指针类型的变量中,如下所示: type MyStruct struct { MyField *string `json:"myField&…

    C 2023年5月23日
    00
  • windows10开始菜单失灵及异常的解决方法

    Windows 10开始菜单失灵及异常的解决方法 在Windows 10系统中,开始菜单是一项非常重要的功能。但是,有时候可能会出现开始菜单失灵或异常等问题,这会影响我们的使用体验。下面是解决这些问题的一些方法。 方法一:重新启动Windows Explorer 右键点击任务栏,选择“任务管理器”。 找到“Windows Explorer”进程,右键点击并选…

    C 2023年5月23日
    00
  • C语言链表实现简单图书管理系统

    C语言链表是一种常用的数据结构,通过链表可以实现一些比较复杂的数据管理系统。本篇攻略将讲解如何使用C语言链表实现一个简单的图书管理系统。整个系统的实现分为以下几步: 定义图书数据结构。在本例中,我们需要使用结构体来存储每一本图书的信息,如图书编号、图书名称、图书作者等。 struct Book { int id; char title[50]; char a…

    C 2023年5月23日
    00
  • Android NDK开发(C语言基本数据类型)

    Android NDK开发(C语言基本数据类型)攻略 什么是Android NDK? Android NDK(Native Development Kit)是一个允许您使用C和C++代码在Android设备上开发应用程序的工具集。NDK允许您在Android应用程序中使用底层C和C++代码,从而提高应用程序性能。使用NDK可以实现以下功能: 构建基于C/C+…

    C 2023年5月24日
    00
  • C++继承中的对象构造与析构和赋值重载详解

    C++继承中的对象构造与析构和赋值重载详解 介绍 在C++面向对象编程中,继承是一种非常强大的设计模式。继承允许您创建一个新类,该新类从一个或多个现有类继承属性。在继承过程中,有几个重要的概念,包括对象构造和析构以及赋值操作符的重载。本文将重点介绍这些概念,以及在继承过程中如何正确使用它们。 对象构造 当从一个类派生出另一个类时,基类构造函数不会自动调用。相…

    C 2023年5月22日
    00
  • C++实现贪心算法的示例详解

    C++实现贪心算法的示例详解 什么是贪心算法 贪心算法是一种用于求解优化问题的算法。其基本思路是通过每一步局部最优的选择,最终达到全局最优的目标。 贪心算法通常分为三个步骤: 将问题拆分成一系列子问题 对于每个子问题,选择满足条件的局部最优解 将局部最优解合并成全局最优解 如何实现贪心算法 实现贪心算法的关键是确定问题的“贪心策略”,即每一步选择局部最优解的…

    C 2023年5月22日
    00
  • C语言使用广度优先搜索算法解决迷宫问题(队列)

    C语言使用广度优先搜索算法解决迷宫问题(队列)攻略 概述 本攻略主要介绍如何使用 C 语言中的广度优先搜索算法和队列解决迷宫问题。广度优先搜索算法是一种用于遍历或搜索树或图的算法,这里我们将其应用到迷宫问题中。迷宫问题是指在一个有障碍物和可通行区域的矩阵中,从起点到终点找到一条路径的问题。本攻略中,我们将使用队列来存储和处理迷宫问题中的节点。 算法流程 广度…

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