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

一.指针和二维数组

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

2.a[i]代表二维数组中第i行的首个元素的地址,即a[i][0]的地址。

二.进一步思考

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

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

所以由此得出:

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

结论:

a+i与a[i]的地址相同的。

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

因为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

相关推荐
小智学长 | 嵌入式3 分钟前
进阶-数据结构部分:2、常用排序算法
java·数据结构·算法
少了一只鹅3 分钟前
字符函数和字符串函数
c语言·算法
Dr.9271 小时前
1-10 目录树
java·数据结构·算法
双叶8361 小时前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json
子豪-中国机器人1 小时前
C++ 蓝桥 STEMA 省选拔赛模拟测试题(第一套)
开发语言·c++·算法
callJJ1 小时前
Bellman - Ford 算法与 SPFA 算法求解最短路径问题 ——从零开始的图论讲解(4)
数据结构·算法·蓝桥杯·图论·单源最短路径·bellman- ford算法
圈圈编码1 小时前
LeetCode Hot100刷题——轮转数组
java·算法·leetcode·职场和发展
金融小师妹6 小时前
应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
大数据·人工智能·算法
广州智造6 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
Trent19858 小时前
影楼精修-肤色统一算法解析
图像处理·人工智能·算法·计算机视觉