黑马程序员-C-二维数组&指针数组&二维数组指针

本文详细介绍了Java中的二维数组和一维指针数组的概念、定义方式、使用方法以及如何遍历它们。通过实例代码,深入浅出地解释了二维数组的地址访问方式和一维指针数组的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、二维数组:a[3][5]

因为二维数组可以看作是一个特殊的一维数组:每一行的单个元素是一个一维数组。如a[3][5],有3个元素,每个元素是一个含有5个元素的一维数组。所以a[0],a[1]就分别代表第一、二行的地址。

a = &a[0] = &a[0][0] = a[0] —> 第一行地址 = 第一列第一个元素地址
a + 1 = &a[1] = &a[1][0] = a[1] —> 第二行地址 = 第二列第一个元素地址
a + 2 = &a[2] = &a[2][0] = a[2] —> 第三行地址 = 第三列第一个元素地址

a[0] = a = &a[0] = &a[0][0] ——> 第一列地址
a[0] + 1 = &a[0][1] ——> 第二列地址
a[0] + 2 = &a[0][2] ——> 第三列地址
a[0] + 3 = &a[0][3] ——> 第四列地址
a[0] + 4 = &a[0][4] ——> 第五列地址

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};    //二维数组
//    由上分析知,a[0],a[1],a[2]也是代表第一、二、三的地址,则a[1]+2代表a[1][2]的地址,即&a[1][2]
//    i代表行,j代表列。则a[i] = *(a + i), a[i][j] = *(*(a + i) + j)
//    遍历数组
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d\t", *(*(a + i) +j));
        }
    }

//    ************************************************************
/*
    一维指针数组定义格式:
        类型名称 *数组名[数组长度]
    如 int *p[5],表示这个一维指针数组,含有5个指针,这些指针指向整型数据的地址。
    记忆方法:运算符的优先级 []大于*,所以其相当于*(p[5]),p[5]是一个数组,说明其首先是一个数组,然后是一个装有指针的数组。它的作用是一个指针集合。
    注意:因为此外p是指针数组的首地址,所以其是一个二维指针。

 */
    int b, c, d;
    b = 1;
    int *p[3] = {&b, &c, &d};  //p = &p0 , p[0] = &b
    //下面两句代码输出地址相同
    printf("%p\n", p[0]);
    printf("%p\n", &b);

    //下面两句代码输出地址相同
    printf("%p\n", p);
    printf("%p\n", &p[0]);

    //下面两句代码输出地址相同
    printf("%d\n", *p[0]);
    printf("%d\n", **p);

    //因为此外p为二级指针,所以其可以指向二维数组

//    **************************************************************

/*
    二维数组指针
    1.定义格式: 数据类型 (* 指针变量名称)[指向的二维数组列数]
     如 int (*p)[3], 表示指针p可指向列数为3的整型数组。
    2.用途
    二维数组指针是一个行指针,用来指向二维数组的每一行,存放的是行的首地址

 */
    int a3[2][3] = {1,2,3,4,5,6};
    int (*p3)[3] = a3;      //给二维数组指针p3赋值,使其指向二维数组a3
    //遍历数组a3,可用指针p3代替数组名a3,这在需要变量的情况有用,因为可以p3++,而不可以a3++,因为a3是常量

    for (int i = 0; i < 2; i++){
        for (int j = 0; j < 3; j++) {
            printf("%d\t",*(*(p3+i)+j));
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值