c语言笔记 数组进阶题目的理解

发布于:2025-03-10 ⋅ 阅读:(12) ⋅ 点赞:(0)

题目:声明一个二维 int 型数组 a,再声明另一个一维数组指针数组 b,使该数组 b 的每一个指针分别指向二维数组 a 中的每一个元素(即每一个一维数组),然后利用数组 b 计算数组 a 的和。

图解:画图帮助理解

        我们要清楚什么是指针数组和数组指针,我们先要有知识储备才能完美的做好这道题目.

//定义一个指针数组 
int *p[3]; 

        指针数组:数组的元素是一个个指针,[]的元素优先级高于*;指针数组跟其他的普通数组的区别在于数组的元素不一样。

//定义一个数组指针
int (*p)[3];

        一维数组指针:指一个指针指向int [3]型的数组,跟普通指针没有区别。就是指向类型不一样.

一维数组指针数组 b是什么呢?

在之前的笔记中,我们知道这是一个数组。那么数组的元素类型和变量类型的确定(之前的笔记),比如数组的元素就是把数组名+[]拿走,剩下的就是数组的元素类型。

那么该数组b的元素类型是数组指针,我们知道数组指针是指向数组的指针,所以这种复杂的类型就是:一个数组中存放着数组指针,数组的元素是数组指针。数据里面的指针指向一维数组。

代码:

#include <stdio.h>
// 数组指针数组
int main(void)
{
    int a[2][3] = {1, 2, 3, 4, 5, 6}, sum = 0; // 定义一个二维数组 该二维数组有两个元素
    // 数组指针数组b int (*)[] 数组指针类型
    int(*b[2])[3];
    b[0] = a;
    b[1] = a + 1; // 直接b[1]当作指针来用 a+1表示二维数组的第二个元素

    printf("%d\n", *(*(b[0] + 0)));     // 数组指针类型的指向    1
    printf("%d\n", *(*(b[0] + 0) + 1)); // 数组指针类型的指向  2  b[0][0][1]
    printf("%d\n", b[0][0][1]);

    printf("%p\n", b[0] + 1); // +1是以类型的字节为单位进行偏移
    printf("%p\n", b[1]);

    // 第一种方式:
    for (int i = 0; i < 6; i++)
    {
        sum += (*(*(b[0] + 0) + i)); // 等价于sum += b[0][0][i];
    }
    printf("第一种方式:%d\n", sum);

    // 第二种方式
    for (int i = 0; i < 2; i++)
    {
        for (int n = 0; n < 3; n++)
        {
            sum += b[i][0][n]; //等价于 *(*(b[i]+0)+i)
        }
    }
    printf("第二种方式:%d\n", sum);

    return 0;
}