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

下面我来详细讲解“赌你会懵的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日

相关文章

  • vue长按事件

    当然,我很乐意为您提供有关“Vue长按事件”的完整攻略。以下是详细的步骤和两个示例: 1 Vue长按事件 Vue长按事件是一种在Vue应用程序中实现长按操作的方法。以下是使用Vue长按事件的步骤: 1.1 安装vue-touch 首先,您需要安装vue-touch。您可以使用以下命令在Vue应用程序中安装vue-touch: npm install vue-…

    other 2023年5月6日
    00
  • Spring依赖注入的两种方式(根据实例详解)

    Spring依赖注入的两种方式 Spring是一个开源的Java框架,提供了依赖注入(Dependency Injection)的功能,用于管理对象之间的依赖关系。Spring的依赖注入有两种方式:构造函数注入和属性注入。 构造函数注入 构造函数注入是通过调用对象的构造函数来实现依赖注入。在Spring中,可以通过在类的构造函数上添加@Autowired注解…

    other 2023年8月6日
    00
  • 用C++实现推箱子小游戏

    用C++实现推箱子小游戏完整攻略 推箱子是一款经典的益智游戏,是许多程序员入门学习游戏开发的练手项目之一。下面我们将讲解如何用C++实现推箱子小游戏的完整攻略。 步骤一:环境搭建 首先,我们需要安装C++的开发环境。推荐使用Visual Studio作为开发工具,可以从官网下载安装。 安装后,打开Visual Studio,创建一个新的空项目。在项目中创建一…

    other 2023年6月26日
    00
  • 如何修复Win11中的Hypervisor错误?Win11中的Hypervisor错误修复方法

    修复Win11中的Hypervisor错误可能涉及到多个步骤,下面我将提供一个完整的攻略,包括了诊断问题、确定原因以及尝试修复问题的方法。 1. 确定错误类型 在修复Hypervisor错误之前,我们需要明确错误的具体类型。有助于更好地理解问题的性质并有针对性地解决错误。首先,我们需要检查错误日志,这通常可以通过事件查看器或PowerShell进行操作。最常…

    other 2023年6月27日
    00
  • 魔兽世界7.1痛苦术天赋神器路线及输出手法详解

    魔兽世界7.1痛苦术天赋神器路线及输出手法详解 痛苦术是魔兽世界中一种非常有趣的职业,它在近战和远程输出方面表现出色。本篇攻略将为大家详细讲解痛苦术神器路线和输出手法,并提供两个实例以说明。 神器路线 阶段1 升级“召唤掌控”(Call of the Void),这是单体输出的主力技能。 阶段2 在阶段2,你需要提高多目标技能的输出,目标是“召唤者”的书。 …

    other 2023年6月27日
    00
  • Go语言Goroutinue和管道效率详解

    Go语言Goroutine和管道效率详解攻略 1. 什么是Goroutine和管道 在Go语言中,Goroutine是一种轻量级的线程,可以在程序中并发执行。Goroutine由Go语言的运行时系统调度,可以在多个逻辑处理器上同时运行。Goroutine的创建和销毁开销很小,因此可以创建大量的Goroutine来处理并发任务。 管道(Channel)是Gor…

    other 2023年7月29日
    00
  • VBScript开发自动化测试脚本的方法分析

    VBScript开发自动化测试脚本的方法分析 自动化测试是软件开发过程中的重要环节,可以提高测试效率和准确性。VBScript是一种基于Visual Basic的脚本语言,适用于Windows平台。下面是VBScript开发自动化测试脚本的方法分析,包括两个示例说明。 1. 确定测试目标和需求 在开始开发自动化测试脚本之前,首先需要明确测试的目标和需求。这包…

    other 2023年7月27日
    00
  • 魔兽世界邪DK属性优先级 6.0邪DK如何堆属性详解

    魔兽世界邪DK属性优先级 6.0邪DK如何堆属性详解 1. 简介 邪恶死亡骑士(邪DK)是魔兽世界中的一个职业,他们以邪恶和死亡的力量为武器,在战斗中以高伤害输出为特点。在6.0版本中,邪DK的属性优先级决定了他们的输出能力和存活能力。 2. 属性优先级 邪DK的属性优先级如下: 力量(Strength):力量是邪DK最重要的属性,它直接影响了邪DK的攻击力…

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