在日常做题的过程中,发现了一个关于通过指针访问二维数组的问题

题目如下:

**若有以下语句:

**int a[4][5],(*p)[5];

p=a;

`下面哪个选项表示a数组中的元素?

`A.  p+1

B. * (p+3)

C. * (p+1)+3

D. ( p+2)`

正确答案为D,我选择了B项。

以下是我的想法 (注意!!这只是我自己错误的思路!!!)

由题干可得:

开了一个4行5列名为a的二维数组,同时声明了一个大小为5的数组指针。

此时p中存着数组a的首地址,即指针p指向a[0][0],即(*p)== a[0][0] 。

因此B项中,*(p + 3) 等价于 a[0][3] (此处我的思路开始出错,原因是没有理解指针表示二维数组时的原理)

所以我认为B项为正确答案;

正确思路:

由题干可得:

开了一个4行5列名为a的二维数组,同时声明了一个大小为5的数组指针。

此时p中存着数组a的首地址,即指针p指向a[0][0],即(*p)== a[0][0] 。

此时,首先来了解一下指针表示二维数组时的原理:

假如有一个二维数组:

int a[3][4] = {{1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23}};

其中,a 是二维数组名。a 数组包含 3 行,即 3 个行元素:a[0],a[1],a[2]。每个行元素都可以看成含有 4 个元素的一维数组。而且 C 语言规定,a[0]、a[1]、a[2]分别是这三个一维数组的数组名。

a[0]、a[1]、a[2] 既然是一维数组名,一维数组的数组名表示的就是数组第一个元素的地址,所以 a[0] 表示的就是元素 a[0][0] 的地址,即 a[0]&a[0][0];a[1] 表示的就是元素 a[1][0] 的地址,即 a[1]&a[1][0];a[2] 表示的就是元素 a[2][0] 的地址,即 a[2]==&a[2][0]。

所以二维数组a[M][N]中,a[i]表示的就是元素a[i][0]的地址,即a[i] == &a[i][0] ;我们知道,在一维数组 b 中,数组名 b 代表数组的首地址,即数组第一个元素的地址,b+1 代表数组第二个元素的地址,…,b+n 代表数组第 n+1 个元素的地址。所以既然 a[0]、a[1]、a[2]、…、a[M–1] 分别表示二维数组 a[M][N] 第 0 行、第 1 行、第 2 行、…、第 M–1 行各一维数组的首地址,那么同样的道理,a[0]+1 就表示元素 a[0][1] 的地址,a[0]+2 就表示元素 a[0][2] 的地址,a[1]+1 就表示元素 a[1][1] 的地址,a[1]+2 就表示元素 a[1][2] 的地址……a[i]+j 就表示 a[i][j] 的地址,即a[i]+j == &a[i][j]即&a[i][0]+j == &a[i][j]

又因为在一维数组中 a[i] 和 *(a+i)  等价,即a[i] == *(a+i)这个关系在二维数组中同样适用,二维数组 a[M][N] 就是有 M 个元素 a[0]、a[1]、…、a[M–1] 的一维数组。所以可得*(a+i)+j == &a[i][j]

至此,我们可以理解为什么B项是错误的。

那么为什么要选D呢?

二维数组可以想象成一个一维数组,二维数组 a[3][4] 就是有三个元素的一维数组,同时,这三个元素又各是一个一维数组 (为了方便理解,此处一位数组命名为t)t[0]、t[1]、t[2] (通俗来讲就是两个一维数组的嵌套)。所以数组 a 的第一个元素不是 a[0][0],而是 t[0],所以数组名 a 表示的不是元素 a[0][0] 的地址,而是 t[0] 的地址,而t[0]表示的是一维数组t的第一个元素。

所以由此可得:a == &a[0];

a[0] == &a[0][0];

综合上面两个结论,得出:*(p + 2) == &a[2][0];

*(*(p + 2)) == a[2][0];

所以选D项。

结束。

c语言的二维数组的指针访问,用指针访问二维数组相关推荐

  1. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  2. 【C 语言】二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 )

    文章目录 一.二级指针案例 ( 返回二维数组 ) 二.完整代码示例 一.二级指针案例 ( 返回二维数组 ) 将 "12,ab,345," 字符串 以 逗号 "," ...

  3. 二维数组(解引用、指针数组、数组的指针)——C语言

    二维数组 在说二维数组前先来说下一维数组中的指针数组和和数组的指针 一.一维数组中指针数组和数组指针的区别 指针数组: 1 int *p[5]; []的优先级比*高,首先它是一个数组,它的大小是5,它 ...

  4. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  5. 二级(多级)指针,二级指针和二维数组的避坑,指针面试考题

    1.二级指针的的认识 2.二级指针的实战 想获得二维数组的某个人的位置,采用的是return的方式 如果把第三行的int * 换成void ,把ppos换成传参的方式做. 结果崩溃了 原因是 是个野指 ...

  6. C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇

    序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...

  7. 【C++】二维数组的行指针和列指针

    在C++中,数组与指针有密切的关系.任何通过数组和下标实现的表达式可等价地通过指针和偏移量实现.下面首先介绍一维数组与指针的关系,之后介绍二维数组的行指针和列指针. 1.一维数组和指针 定义一个长度为 ...

  8. C和指针之二维字符串数组用指针数组、数组指针、二级指针打印

    1.问题 二位字符串数组用指针数组.数组指针.二级指针打印       2.测试代码 #include <stdio.h>int main() {char value[4][5] = {& ...

  9. c 语言 二维数组地址,C/C++ 关于一维或二维数组首地址表示含义

    C/C++ 关于一维或二维数组首地址表示含义 发布时间:2020-06-26 10:35:21 来源:51CTO 阅读:210 作者:sonissa 这是一个经常会忘却的知识点,最近也一直在吃这方面的 ...

  10. C语言-数组名真的不是指针

    文章目录 1 前言 2 关于一维数组 3 sizeof运算符和自增运算符 4 数组名也不是常量指针 5 总结 1 前言 参照我之前的两篇文章: 二维数组做函数的参数 动态创建二维数组 事实告诉我们,二 ...

最新文章

  1. SQL操作的组成部分-数据查询
  2. React入门系列 - 5. 表单与变量的关联
  3. Dubbo快速启动示例
  4. 深度 | 人工智能全局概览:通用智能的当前困境和未来可能
  5. 安卓运行php程序,安卓怎么运行php?
  6. JSON基础与数据解析、JSON方法、AJAX初识
  7. HDOJ 1002 A + B Problem II 解题报告
  8. ROS入门-14.参数的使用与编程方法
  9. 了解第三方授权OAuth
  10. java使用mysql的escape遇到的坑
  11. CentOS 5 全功能WWW服务器搭建全教程
  12. Axure8.0如何汉化?
  13. 企业网站排名,关键词选择原则,6个基本策略
  14. 网络抖动、丢音、卡顿
  15. Leetcode 809. Expressive Words
  16. 蚁群算法java实现_简单蚁群算法 + JAVA实现蚁群算法
  17. 数据库(mysql)之事务和存储引擎
  18. 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...
  19. 奶牛问题3:奶牛派对
  20. WeexBox 快速上手

热门文章

  1. gulp项目找不到html标签,通过yeoman、gulp、angular编写前段时的html模板处理,打包后找不到html的问题解决...
  2. 底部任务栏桌面计算机怎么删除,桌面下方的任务栏总是隐藏怎么办
  3. CodeSmith模板代码生成实战详解
  4. aspupload中文文件名乱码解决
  5. ARPR软件破解带密码rar格式文件
  6. 关于联想硬盘保护卡还原卡同传不能连接无法登录的解决方法
  7. 软件工程__CMMCMMI
  8. 工作范围说明书与需求说明书
  9. CashFiesta注册网赚
  10. 简单博饼游戏的实现(java)