C语言二维数组指针的概念及使用

当我们把一维数组的数组名(即指向数组首元素的指针)赋值给一个指针变量时,这个指针变量就指向了这个一维数组的首元素,因此可以通过数组名或指向它的指针访问该元素。同样的,当我们把二维数组的数组名作为指针变量的初值时,这个指针变量也指向了这个二维数组的首元素(即第一行第一列的元素),可以通过数组名或指向它的指针访问该元素,而数组名本身指向的也是二维数组的首元素。这个指向二维数组首元素的指针变量称为指向二维数组的指针。

那么,对于一个M行N列的二维数组,它的数组名即代表一个指向M个一维数组的指针,这M个一维数组中每个数组都有N个元素,因此可以把二维数组看作是一个MN个元素的线性数组,那么该线性数组又可以用指针表示,即指向MN个元素的指针,这个指向M*N个元素的指针又可以表示为一个指向指针的指针,即指向指向一维数组的指针的指针,也即指向指向二维数组首元素的指针的指针,这就是指向二维数组的指针的指针。

下面通过两个示例来说明二维数组指针的使用:

示例一

假设有一个3行4列的二维数组,其元素值为:

1 2 3 4
5 6 7 8
9 10 11 12

我们可以声明一个指向该二维数组的指针,以及使用指针访问元素:

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[4];  // 声明一个指向含有4个元素的一维数组的指针
p = a;  // 将a赋值给p,p现在指向二维数组a的首元素
printf("%d\n", a[1][2]);  // 输出7
printf("%d\n", (*p)[2]);  // 输出3
printf("%d\n", (*(p+1))[2]);  // 输出7

在该例中,我们声明了一个名为a的3行4列的二维数组,并将其初始化。接着声明一个指向含有4个元素的一维数组的指针p,并将其赋值为a,这样p就指向了a的首元素,即a[0],这里要注意,由于a的每一行都含有4个元素,因此p需要指向含有4个元素的一维数组。接着我们使用数组名和指针来访问第二行第三列的元素,都成功输出了7。

示例二

假设有一个5行3列的二维数组,其元素为10到24之间的随机整数,我们要求该二维数组每行(即每个一维数组)的元素之和,并将结果存储到一个一维数组中,最后输出该一维数组的元素。

#include <stdio.h>

#define ROW 5
#define COL 3

int main()
{
    int a[ROW][COL];
    int sum[ROW] = {0};
    int i, j;
    int (*p)[COL];

    // 生成二维随机整数数组a
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            a[i][j] = rand() % 15 + 10;
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    // 计算每行元素之和
    p = a;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            sum[i] += *(*(p+i)+j);
        }
    }

    // 输出每行元素之和
    for (i = 0; i < ROW; i++)
    {
        printf("The sum of row %d is %d\n", i+1, sum[i]);
    }

    return 0;
}

在该例中,我们首先生成一个5行3列的随机整数二维数组a,接着声明一个指向该二维数组的指针p,并将其初始化为a,接着使用嵌套的for循环计算每行元素之和,并将其存储在sum数组中,最后输出每行元素之和。由于p一开始指向的是a的首元素,因此使用*(*(p+i)+j)可以遍历该二维数组的所有元素,并计算每行元素之和。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言二维数组指针的概念及使用 - Python技术站

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

相关文章

  • 在Linux系统的服务器上隐藏PHP版本号的方法

    在Linux系统的服务器上隐藏PHP版本号可以通过以下步骤完成: 打开终端并登录到服务器。 找到并编辑PHP配置文件php.ini。通常,该文件位于/etc/php/目录下。使用以下命令打开文件: sudo nano /etc/php/php.ini 在php.ini文件中,查找并定位到以下行: expose_php = On 将其修改为: expose_p…

    other 2023年8月3日
    00
  • android自定义组件实现方法

    Android自定义组件实现方法 自定义组件能够满足各种屏幕适配需求,同时也能够实现创意独特的UI效果。本攻略将为你提供实现自定义组件所需的步骤和相关知识,并提供两个常用的示例说明。 一、自定义属性 在布局文件中定义自定义属性是实现自定义组件的关键步骤。在values目录下创建attrs.xml文件,定义自定义属性的格式和类型。 示例1:在attrs.xml…

    other 2023年6月25日
    00
  • Windows10在文件资源管理器中显示/隐藏文件扩展名(后缀名)

    Windows 10文件资源管理器中显示/隐藏文件扩展名(后缀名)攻略 在Windows 10的文件资源管理器中,你可以选择显示或隐藏文件的扩展名(也称为后缀名)。下面是详细的攻略,包含两个示例说明。 显示文件扩展名 要在文件资源管理器中显示文件扩展名,请按照以下步骤进行操作: 打开文件资源管理器。你可以通过按下Win + E键组合来快速打开它。 在文件资源…

    other 2023年8月5日
    00
  • Div+CSS 布局入门教程之二 构建网站

    Div+CSS 布局入门教程之二 构建网站 在这个教程中,我们将学习如何使用Div和CSS来构建一个简单的网站布局。我们将使用HTML的<div>元素来创建不同的区块,并使用CSS来定义它们的样式和布局。 步骤一:创建HTML结构 首先,我们需要创建一个基本的HTML结构。以下是一个示例: <!DOCTYPE html> <ht…

    other 2023年9月5日
    00
  • Android中使用PagerSlidingTabStrip实现导航标题的示例

    Android中使用PagerSlidingTabStrip实现导航标题的示例攻略 简介 PagerSlidingTabStrip是一个开源库,用于在Android应用中实现带有导航标题的滑动标签页。它提供了一种简单而灵活的方式来创建和管理标签页,并且可以与ViewPager一起使用。 步骤 步骤一:添加依赖 首先,你需要在你的Android项目中添加Pag…

    other 2023年8月21日
    00
  • java环境变量配置和adb的配置教程详解

    Java环境变量配置教程 为什么需要Java环境变量配置 Java作为目前最常用的编程语言之一,安装与配置过程中涉及的环境变量十分重要。Java环境变量配置的目的是为了让操作系统识别Java的安装位置,方便开发者使用Java JDK和其他相关工具集。如果没有正确设置Java环境变量,就很难使用Java来编译运行自己的代码。 配置Java环境变量 1. 下载并…

    other 2023年6月27日
    00
  • jsdate扩展format()函数

    以下是详细讲解“jsdate扩展format()函数的完整攻略”: jsdate扩展format()函数的完整攻略 在JavaScript,Date对象提供了format()函数来格式化日期。但是,该函数的格式化选项比较有限,无法满足所有的需求。因此,我们可以使用jsdate扩展来扩展format()函数的功能。本攻略将介绍如何使用jsdate扩展forma…

    other 2023年5月10日
    00
  • vue父子组件传参方式

    Vue 父子组件传参方式 在 Vue 中,组件的通信是非常重要的。父子组件是两个比较常见的组件角色,如何在父组件和子组件之间传递数据呢? 本文将探讨 Vue 中父子组件传参的几种方式,包括:props、$emit 和 provide/inject。 Props Props 是一种父组件向子组件传递数据的方式。在子组件中通过 props 定义属性,来声明要接收…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部