赌你会懵的C语言指针进阶数组场景解析

yizhihongxing

下面我来详细讲解“赌你会懵的C语言指针进阶数组场景解析”的完整攻略。

概述

在C语言中,数组是非常常用的数据类型。但是对于数组的理解,不仅要理解数组的基本概念,还要深入理解数组和指针的关系。本文将通过两条示例来解析C语言指针进阶数组场景,并教会你如何正确地理解和使用指针和数组。

示例1:指针数组

假设我们有一个学生结构体,并且需要定义一个数组来存储多个学生的信息。我们可以这样定义:

struct Student
{
    char name[20];
    int age;
    float score;
};

struct Student arr_stu[3] = {
    {"Tom", 18, 89.5},
    {"Jerry", 19, 96.0},
    {"Mickey", 20, 98.0}
};

但是,如果我们需要在一个函数中访问这个学生数组,并且还需要对数组中的元素进行修改,此时就需要用到指针。我们可以使用指针数组来实现:

struct Student
{
    char name[20];
    int age;
    float score;
};

void modifyScore(struct Student *stu)
{
    stu->score += 10;
}

int main()
{
    struct Student *p_arr_stu[3];
    p_arr_stu[0] = &arr_stu[0];
    p_arr_stu[1] = &arr_stu[1];
    p_arr_stu[2] = &arr_stu[2];

    for (int i = 0; i < 3; i++)
        modifyScore(p_arr_stu[i]);

    for (int i = 0; i < 3; i++)
        printf("%s的分数是%.1f\n", p_arr_stu[i]->name, p_arr_stu[i]->score);

    return 0;
}

在这个示例中,我们定义了一个指针数组p_arr_stu,数组的每个元素都是一个指向struct Student结构体的指针。然后将arr_stu数组中每个元素的地址分别赋给p_arr_stu数组的每个元素。接着,我们遍历这个指针数组,并逐个调用modifyScore函数对每个学生的分数进行修改。最后,我们再遍历一遍指针数组,输出每个学生的姓名和修改后的分数。

示例2:二维数组

我们再来看第二个示例:二维数组。假设我们需要定义一个5x5的矩阵,我们可以使用二维数组来实现:

int arr[5][5] = {
    {1, 2, 3, 4, 5},
    {6, 7, 8, 9, 10},
    {11, 12, 13, 14, 15},
    {16, 17, 18, 19, 20},
    {21, 22, 23, 24, 25}
};

如果我们需要打印这个矩阵,可以使用两个嵌套的for循环来遍历。但是,如果我们需要在一个函数中操作这个二维数组,并需要使用指针来完成,我们该怎么做呢?

实际上,在C语言中,一个二维数组可以被看作是一个指针的指针。我们可以这么定义:

void printMat(int **p, int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
            printf("%d ", *((int*)p + i*col + j));
        printf("\n");
    }
}

int main()
{
    int arr[5][5] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15},
        {16, 17, 18, 19, 20},
        {21, 22, 23, 24, 25}
    };

    int *p_arr[5];
    for (int i = 0; i < 5; i++)
        p_arr[i] = arr[i];

    printMat(p_arr, 5, 5);

    return 0;
}

这里我们首先定义了一个printMat函数来打印矩阵。这个函数的第一个参数是一个指向指针的指针int **p,表示一个二维数组,第二个参数是矩阵的行数row,第三个参数是矩阵的列数col。在这个函数中,我们使用两个嵌套的for循环遍历矩阵,并使用指针的方式来访问矩阵的元素。

main函数中,我们首先定义了一个二维数组arr,然后定义一个指针数组p_arr,将二维数组的每一行的地址分别赋值给指针数组的每个元素。最后,我们将指针数组p_arr传给printMat函数,来打印整个矩阵。

结语

通过以上的两个示例,我们可以看到,指针和数组在C语言中是非常重要的数据类型,掌握好这两个数据类型的关系,能够让我们在C语言中更加自如地进行编程。希望本文能够对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:赌你会懵的C语言指针进阶数组场景解析 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 快速创建React项目并配置webpack

    创建React项目并配置Webpack是一个非常基础且重要的操作,下面是详细的步骤。 步骤一:初始化项目 使用npm初始化项目,首先需要安装Node.js,然后使用npm命令初始化项目,具体命令为: npm init 步骤二:安装依赖包 React开发中需要安装的必要依赖包有:React、React-DOM,Webpack开发中需要安装的必要依赖包有:Web…

    other 2023年6月27日
    00
  • jmeterjdbcrequest使用详解

    jmeterjdbcrequest使用详解 简介 jmeterjdbcrequest是jmeter的一个插件,它可以模拟对数据库的操作。在测试中,我们通常需要对数据库进行一些操作,例如插入、更新、查询等等,而jmeterjdbcrequest可以帮助我们进行这些操作并且提供较高的灵活性。 安装 在使用jmeterjdbcrequest之前,我们需要先安装它。…

    其他 2023年3月29日
    00
  • 使用whiptail写linux字符界面ssh链接工具2.0

    本文将介绍使用whiptail写Linux字符界面SSH链接工具2.0的完整攻略,包括whiptail的基本用法、SSH链接工具的设计思路、代码实现等内容。同时,本文还将提供两个示例说明,以帮读者更好地理解whiptail的使用方法和SSH链接工具的实现过程。 1. whiptail的基本用法 whiptail是一个基于ncurses库的字符界面工具,它可以…

    other 2023年5月5日
    00
  • iPhone7如何删除软件 苹果iPhone7手机删除软件图文教程

    iPhone7如何删除软件 – 苹果iPhone7手机删除软件图文教程 1. 通过主屏幕删除应用 在主屏幕上找到您想要删除的应用程序图标,轻轻按住它(不要松开手),直到图标开始摇晃或震动 点击应用程序图标上出现的”X”符号,确认是否要删除该应用程序 点击“删除”以删除应用,或者点击“取消”放弃删除 示例说明: 假设你要删除手机上的“Instagram”,首先…

    other 2023年6月25日
    00
  • 怎么解压文件

    当我们从网络或其他地方下载了一个压缩文件时,需要解压文件才能使用其中的内容。下面是解压文件的完整攻略。 1. 下载压缩文件 首先,需要下载压缩文件到本地计算机。可以从网站、FTP服务器和其他渠道下载。 2. 确认压缩文件格式 要正确地解压缩文件,需要知道它的格式。目前常见的压缩文件格式有.zip、.rar、.tar、.gz等,还有一些特殊的格式。根据文件的扩…

    其他 2023年4月16日
    00
  • 压缩html

    压缩HTML的完整攻略 压缩HTML是一种优化网页性能的方法,可以减小HTML文件的大小,从而提高网页的加载速度。本文将详细讲解压缩HTML的完整攻略,包括缩HTML的原理、常用的压缩工具、手动压缩HTML的方法和两个示例说明。 1. 压缩HTML的原理 压缩HTML的原理是通过去除HTML文件中的空格、换行符、注释等无用字符,从而减小HTML文件的大小。这…

    other 2023年5月7日
    00
  • 深入解析docker文件分层原理

    深入解析Docker文件分层原理 Docker是一种虚拟化容器技术,通过容器技术,可以将应用程序及其依赖项打包成一个轻量级、可移植的容器,并通过Docker Engine安装到任何支持Docker Engine的操作系统上。Docker文件分层原理是Docker的核心原理之一,本篇将从以下方面深入解析Docker文件分层原理。 Docker文件分层原理是什么…

    other 2023年6月27日
    00
  • mysql 5.7.11 安装配置教程

    MySQL 5.7.11 安装配置教程 MySQL是一种关系型数据库管理系统,广泛应用于各种类型的应用程序。本文将介绍如何在Windows 10系统中安装配置MySQL 5.7.11。 安装MySQL 5.7.11 步骤1:下载MySQL 5.7.11 通过MySQL官网(https://dev.mysql.com/downloads/mysql/5.7.h…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部