第34课 多维数组和多维指针

Posted

tags:

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

1. 指向指针的指针

(1)指针的本质变量,会占用一定的内存空间

(2)可以定义指针的指针来保存指针变量的地址值

(3)指针是个变量,同样也存在传值调用传址调用

【实例分析】遍历二维数组

2. 数组名

(1)一维数组名代表数组首元素的地址:int a[5];a的类型为int*

(2)二维数组名同样代表数组首元素的地址:如int a[3][5],a的类型为int(*)[5]。

二维数组 

含义及类型

取地址符(&)

sizeof

数组名:a

①二维数组名a指向数组首元素的地址,即第1行(a[0])的地址(注意,不是a[0][0]的地址)。因此,a被称为行指针,指向第1行元素(一维数组)的地址。这个元素的类型是int(*)[5](即一维数组)。所以a的类型为int(*)[5];a可以看作是行指针,②a + 1表示第二行的指针,a + i表示第i + 1行的指针(也是int(*)[5]类型)……

&a表示整个二维数组的地址,所以&a + 1指向这个二维数组最后一个元素的后面。

 

①sizeof(a)表示整个二维数组的大小。

②sizeof(&a)为指针大小4字节。

③sizeof(*&a)等于sizeof(a)

a[i]

①a[i]的类型:如果把二维数组看作是由三个元素(一维数组)组成的数组,那么这三个一维数组的数组名分别为a[0]、a[1]、a[2]。因此,a[0]可以看作是指向第1行(一维数组)首元素(a[0][0])的地址,a[i]是指向第i + 1行(一维数组)首元素的地址,所以a[i]为int*型

②a[i] + 1表示这行数组第2个元素的地址,即a[i] + 1是指向a[i][1]元素的地址,*(a[i] + 1)是a[i][1]元素的值。同理,a[i] + j是指向a[i][j]的地址,*(a[i] + j)是a[i][j]的值。

&a[i]表示第i + 1行这行整个一维数组的地址。因此,&a[i] + 1是指向这行数组的下一行的指针。

①sizeof(a[i]):a[i]是一个一维数组。sizeof(a[i])为这个数组的大小。

②sizeof(&a[i])为指针大小4字节。

③sizeof(*&a[i])等于sizeof(a[i])

a[i][j]

与a、a[i]类型的含义不同,a[i][j]不再是一个指针,而是元素的类型,即int型

&a[i][j]表示这个元素的地址,即int*型

①sizeof(a[i][j]):a[i][j]表示元素的类型。

②sizeof(&a[i][j])为指针大小。

③sizeof(*&a[i][j])等于sizeof(a[i][j])

备注

①通常情况下,数组名可看作是首元素的地址,而表格中所说的数组名a、a[i]的类型是指当他们代表各自数组的首元素时的类型。

②但当对数组名取地址符(&)或sizeof时,它不能看作是首元素的地址,而代表的是整个数组。请注意表格中&和sizeof两列的分析。

【实例分析】数组的信息

#include <stdio.h>

int main(int argc,char* argv[], char* env[])
{
    
    int a[3][5] = {0};
    int c;
    
    printf("Information for array:a[3][5]:\n");
    printf("a = 0x%08X, a + 1 = 0x%08X, sizeof(a) = %d\n", a, a + 1, sizeof(a));
    printf("&a = 0x%08X, &a + 1 = 0x%08X, sizeof(&a) = %d, sizeof(*&a) = %d\n",
               &a, &a + 1, sizeof(&a),sizeof(*&a));

    printf("\n");

//a[i]指向一个一维数组的首元素a[i]+1指向该行第2个元素sizeof(a[i])不能看成首元素,而是这行整个一维数组
for(c=0;c< 5;c++) { printf("a[%d] = 0x%08X, a[%d] + 1 = 0x%08X, sizeof(a[%d]) = %d,\n", c, a[c], c, a[c] + 1,c, sizeof(a[c])); } printf("\n");
//
对a[i]进行&取地址符时,a[i]不能看作这一行的首元素,而是整个一维数组。即&a[i]表示第i+1的整个数组
//&a[i]+1表示下一行。
for(c=0;c< 5;c++)
    {
      printf("&a[%d] = 0x%08X, &a[%d] + 1 = 0x%08X, sizeof(&a[%d]) = %d, sizeof(*&a[%d]) = %d\n",
               c, &a[c],c, &a[c] + 1,c, sizeof(&a[c]), c, sizeof(*&a[c]));
    }

    return 0;
}

/*
输出结果:
Information for array:a[3][5]:
a = 0x0023FE80, a + 1 = 0x0023FE94, sizeof(a) = 60
&a = 0x0023FE80, &a + 1 = 0x0023FEBC, sizeof(&a) = 4, sizeof(*&a) = 60

a[0] = 0x0023FE80, a[0] + 1 = 0x0023FE84, sizeof(a[0]) = 20,
a[1] = 0x0023FE94, a[1] + 1 = 0x0023FE98, sizeof(a[1]) = 20,
a[2] = 0x0023FEA8, a[2] + 1 = 0x0023FEAC, sizeof(a[2]) = 20,
a[3] = 0x0023FEBC, a[3] + 1 = 0x0023FEC0, sizeof(a[3]) = 20,
a[4] = 0x0023FED0, a[4] + 1 = 0x0023FED4, sizeof(a[4]) = 20,

&a[0] = 0x0023FE80, &a[0] + 1 = 0x0023FE94, sizeof(&a[0]) = 4, sizeof(*&a[0]) = 20
&a[1] = 0x0023FE94, &a[1] + 1 = 0x0023FEA8, sizeof(&a[1]) = 4, sizeof(*&a[1]) = 20
&a[2] = 0x0023FEA8, &a[2] + 1 = 0x0023FEBC, sizeof(&a[2]) = 4, sizeof(*&a[2]) = 20
&a[3] = 0x0023FEBC, &a[3] + 1 = 0x0023FED0, sizeof(&a[3]) = 4, sizeof(*&a[3]) = 20
&a[4] = 0x0023FED0, &a[4] + 1 = 0x0023FEE4, sizeof(&a[4]) = 4, sizeof(*&a[4]) = 20
*/

 

以上是关于第34课 多维数组和多维指针的主要内容,如果未能解决你的问题,请参考以下文章

C 语言数组 ( 多维数组本质 | 步长角度 理解 多维数组本质 )

C 语言数组 ( 多维数组本质 | n 维数组名称本质 是 n-1 级数组指针 )

C之多维数组和多维指针(三十一)

多维数组和多维指针

多维数组

多维数组