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语言基于EasyX库实现有图形界面时钟

    下面详细讲解关于“C语言基于EasyX库实现有图形界面时钟”的完整攻略。 1. 安装EasyX库 首先你需要在本地安装EasyX库,EasyX库是一个图形界面库,支持Win32 API的封装,并且提供一些画图工具函数,可以轻松实现一些基础的图形应用程序。 你可以使用以下两种方式进行安装: 下载EasyX安装包,同时安装Visual Studio,按照Easy…

    C 2023年5月23日
    00
  • C++逐步介绍日期类的使用

    C++逐步介绍日期类的使用 前言 日期类是一种常见的数据类型,它在很多应用中经常被用到。在C++中,日期类可以通过自定义类来实现。在本文中,我们将逐步介绍日期类的使用方法。 基本定义 首先,我们定义一个日期类,包含年、月、日三个属性。这个类的基本定义如下: class Date { public: Date(int year, int month, int …

    C 2023年5月23日
    00
  • windows下在vim中搭建c语言开发环境的详细过程

    一、安装vim 下载vim安装包:从vim官方网站(https://www.vim.org/download.php)下载适合你的操作系统版本的vim安装包,将其保存到本地。 安装vim:双击安装包进行安装,选择安装路径,并勾选”Add to PATH”选项,让vim能够在命令行中被调用。 验证安装:打开命令行窗口,输入”vim”命令,如果出现vim编辑器界…

    C 2023年5月23日
    00
  • C# 格式化JSON的两种实现方式

    下面我会详细讲解“C# 格式化JSON的两种实现方式”的完整攻略。 标准化JSON 在对JSON进行格式化处理之前,我们需要首先将其标准化,这样可以排除语义上的差异,从而方便后续的处理。具体实现方法是:按照字典序对JSON的对对象属性进行排序,这个排序过程会递归遍历对象及其属性。 在C#中,可以使用Newtonsoft.Json库提供的以下类和方法来将JSO…

    C 2023年5月23日
    00
  • C语言扫雷游戏的简单实现

    C语言扫雷游戏的简单实现攻略 一、游戏规则 扫雷是一款益智休闲游戏,其规则如下: 通过左键单击格子,可以将其翻开。如果格子为空白格,则会显示出周围8个格子中的雷数; 如果翻开的格子周围没有雷,则需要自动翻开周围的所有格子,直到边界或者有雷的格子; 通过右键单击格子,可以标记该格子为有雷的格子(或者是有疑问的格子)。一般来说,标记出所有的炸弹格子就算游戏胜利;…

    C 2023年5月23日
    00
  • C#连接Oracle数据库的多种方法总结

    C#连接Oracle数据库的多种方法总结 在C#开发过程中,连接Oracle数据库是一个经常需要面对的问题。本文总结了多种连接Oracle数据库的方法,以供大家参考。 方法一:使用Oracle客户端 这是最经典的连接Oracle数据库的方法。在此之前需要安装Oracle的客户端,下载地址可以在Oracle官网上找到。 使用步骤如下: 在Visual Stud…

    C 2023年5月22日
    00
  • 详解C++ 临时量与临时对象及程序的相关优化

    详解C++ 临时量与临时对象及程序的相关优化 什么是临时量和临时对象 在C++中,我们可以通过语句创建临时变量,这些临时变量被称为临时量(temporary),也称为临时表达式(temporary expression)。例如: int i = 2; int j = i + 3; 在第二个语句中,i + 3是一个临时量,它在完成表达式的计算后就会被销毁。 临…

    C 2023年5月22日
    00
  • C语言关于注释的知识点总结

    C语言关于注释的知识点总结 什么是注释? 注释是在编程中用来解释代码的方式,编码人员可以使用注释帮助自己或其他人更好地理解代码或实现逻辑功能的方式。 注释的分类 在C语言中,注释分为两种类型: 单行注释 多行注释 单行注释 单行注释格式以//开头,后跟注释文本,直到行末为止,例如: // 这是单行注释示例 int a = 1; // 这是一个单行注释示例,仅…

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