C语言:定义指向二维数组的指针变量

Posted 小威威__

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言:定义指向二维数组的指针变量相关的知识,希望对你有一定的参考价值。

C语言:定义指向二维数组的指针变量

标签: C语言 二维数组 指针

by 小威威


1.引入

我们知道,要在函数中处理数组,一般要给函数传递指针。那么,对于一维int数组a[10],我们可以定义一个int *类型的指针变量p指向该数组。为什么这样定义?(按照我下面的理解方式有利于理解二维数组指针的定义)

首先我们可以把这个一维数组中的10个元素当作10个数组,每个数组都只有一个元素,即指针在每一次移动,都只需指向一个int类型的变量(通过指针对数组进行操作),故定义指向一个int变量的指针。

那么对于二维数组a[3][2],我们要定义一个 int (*p) [2]的指针。首先我们来分析一下这个指针的类型。它也等价于这种形式:int [2] *p。意思是定义一个指向两个int类型变量的指针。当你学了结构体,你就对这种数据类型的定义方式不陌生了。但没有学过结构体,就有点抽象了。我先举个简单的例子:例如我定义一个数组int a[10],其实它也可以表示成另一种形式:int [10] a。意思是定义一个变量a,它是int [10]类型的,即它是一个拥有10个int变量长度的变量,即是数组。那对于二维数组a[3][2],为什么要定义一个指向两个int变量的指针呢?

按照前面对一维数组的分析,我们可以把这个二维数组看作是三个数组,每个数组有两个元素。指向该二维数组的指针在进行移动时,它指向的是一整个数组,即两个int类型,所以需要定义int [2] 类型的指针变量。

由此我们可以总结规律,指向二维数组a[i][j]的指针类型必然是 int [j] *类型。

2.实例

# include <stdio.h>
int main(void) 
    int a[4][3] = 
        1, 2, 12,
        3, 4, 34,
        5, 6, 56,
        7, 8, 78
    ;
    int (*pArr) [3];  //一定要加上括号,因为[]的优先级高于*
    pArr = a;
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 3; j++)
            printf("%d ", pArr[i][j]);
    return 0;

3.提醒

有人会说难道不能定义一个int**的指针类型吗?那你可能是被动态数组影响到了。其实我前面讲的都是针对于静态数组。对于静态数组,它在内存中所占的空间是连续的,只需要用到地址,所以只要一颗;而动态数组是先建立一个一维数组,然后分别在一维数组的元素内再开辟一段连续的空间,它就需要地址的地址,所以需要两个*。这很重要很重要噢!!!


以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!


以上是关于C语言:定义指向二维数组的指针变量的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何定义指针指向字符型二维数组

C语言中关于二维数据指针的问题?

C语言指向二维数组的指针

在C语言中能否直接给指针指向的数据赋值?为啥?

C语言 如何定义一个二维指针数组?

C语言二维数组指针变量是啥,int (*p)[2]啥意思