62.指针和二维数组(2)

一.指针和二维数组

1.如a是一个二维数组,则数组中的第i行可以看作是一个一维数组,这个一维数组的数组名是ai

2.ai代表二维数组中第i行的首个元素的地址,即ai0的地址。

二.进一步思考

二维数组可以看作是数组的数组,本质还是一维数组。所以我们可以把二维数组的一行看作是一个数组元素,此时二维数组就会变成一个一维数组。如下图所示

此时,二维数组a22变成了只有俩个元素a0和a1的一维数组。因为在一维数组中p=&a0可以简写成p=a;

所以由此得出:

数组名a就是一维数组元素a0的地址,即二维数组a中第0行的地址。a+1则是二维数组a中第1行的地址。所以a+i则是二维数组a中第i行的地址。

结论:

a+i与ai的地址相同的。

这里需要注意的是:*(a+i)+j才是aij的地址。并不是(a+i)+j是aij的地址。

因为a+i表示的是二维数组中第i行的地址,而不是第i行首个元素的地址,此时a+i表示的是整个第i行数组,*a+i表示的才是第i行数组中首个元素的地址。也就是说虽然a和*a的值相同,但是表示的意义不同。

举例验证:

复制代码
#include <stdio.h>

int main(void)
{
    int a[2][2]={0,1,2,3};
    int i = 0;
    int j = 0;

    for(i=0;i<2;i++){
        for(j=0;j<2;j++){
            printf("a[%d][%d] addr is %p,value is %d\n",i,j,a[i]+j,*(a[i]+j));
        }
    }
    printf("**********************************\n");
    for(i=0;i<2;i++){
        for(j=0;j<2;j++){
            printf("a[%d][%d] addr is %p,value is %d\n",i,j,*(a+i)+j,*(*(a+i)+j));
        }
    }

    printf("%p\n",*a);
    printf("%p\n",*a+1);
    printf("%p\n",a);
    printf("%p\n",a+1);


    return 0;
 
}

运行结果:

三.视频教程

62.指针和二维数组(2)_哔哩哔哩_bilibili

相关推荐
Chester_199915 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
裕晟资质规划16 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
en.en..17 小时前
C语言 标准输入 / 输出缓冲区
算法
吃好睡好便好19 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球19 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
专注仿真20 小时前
Spring AI 实现智能对话系统项目指南
数据结构·spring·机器学习
靠沿20 小时前
贪心算法专题(二)
算法·贪心算法
间歇性努力持续性发呆的野生快乐选手21 小时前
高级数据结构:树状数组
数据结构
猎头南楼21 小时前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法
啥都想学点的研究生1 天前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归