最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习。自己纠结的问题是二维数组 int a[3][4]的数组名是二级指针吗?答案不是,而在的复习讲解上说是地址的地址是错的(但是他的讲解确实很让人懂二维数组的使用),a 退化为指针后,类型为 int (*)[4], 该指针指向含 4 个 int 类型元素的一维数组。(例:一维数组 b [4],b 则退化为元素指针)既然 a 都不是指针的指针,则想通过 int **p=a 对 p 进行赋值就是不可实现的。
那么如何实现通过指针p来对a[3][4]来进行操作?
在看如何赋值之前有必要了解一下
这几个 &a,a,a[0],&a[0],&a[0][0] 地址 (因 a[0][0] 为元素值,不在讨论范围内) 的不同之处。
#include<stdio.h>
void main()
{
int a[3][4]={20,30,40,50,60,70,80,90,100,110,120,130},i,j;
printf("&a=%dn",&a);
printf("&a+1=%dn",&a+1);
printf("a=%dn",a);
printf("a+1=%dn",a+1);
printf("&a[0]=%dn",&a[0]);
printf("&a[0]+1%dn",&a[0]+1);
printf("a[0]=%dn",a[0]);
printf("a[0]+1=%dn",a[0]+1);
printf("&a[0][0]=%dn",&a[0][0]);
printf("&a[0][0]+1=%dn",&a[0][0]+1);
}
运行结果(该结果为本人电脑运行看,可能有所不同):
&a=5241364
&a+1=5241412
a=5241364
a+1=5241380
&a[0]=5241364
&a[0]+15241380
a[0]=5241364
a[0]+1=5241368
&a[0][0]=5241364
&a[0][0]+1=5241368
通过观察可以看出 &a,a,a[0],&a[0],&a[0][0] 的结果都是 5241364,证明他们的地址是相同的。
但是都进行 + 1 操作后就知道不同了。
&a+1 和 & a 差值为 48,正好是二维数组的长度(4(int 长度)X3X4=48),+1 是加了一个二维数组长度。
a+1 和 a 的差值为 16,是 a [][4] 的长度,进行 + 1 则从 a 退化为 a [0] 的地址进行加值之后变为 a [1] 的地址,可以证明 a 加 1 是从 a [0] 到 a [1] 的变化。
&a [0]+1 和 & a [0] 的差值为 16,&a [0] 表示一行 (一个一维数组) 的首地址,进行 + 1 后是下一组的首地址& a [1]。a [0]+1 和 a [0] 的差值为 4,a [0] 表示这一行的首元素的地址,+1 则是从 a [0] 开始退化为 a [0][0] 的指针之后进行加值则变为 a [0][1] 的地址;&a [0][0]+1 和 & a [0][0] 的差值为 4,&a [0][0] 表示这一行(一维数组)的首元素的值的地址,当 + 1 则变为 a [0][1] 的地址。
如果还是不了解看下图(搜集于网络图片)

分析图
由上面了解之后再看下面就方便理解了。
第一种方式:通过将定义 p 为:int (*p)[4] 形式,和上面 a 所退化为指针后的类型相同,因此则可以直接将 a 赋值给 p;代码如下:
#include<stdio.h>
void main()
{
int a[3][4]={20,30,40,50,60,70,80,90,100,110,120,130},i,j;
int (*p1)[4]=a;
for(i=0;i<3;i++)//数组形式(方便理解)
{
for(j=0;j<4;j++)
printf("%3d ",p1[i][j]);
printf("n");
}
printf("n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)//指针形式
printf("%3d ",*(*(p1+i)+j));
printf("n");
}
}
第二种方式:在内存中,并不存在多维数组,因为内存是一维的,内存里面不分行也不分列,元素都是按顺序一个一个往后排的,所以二维数组中的每一个元素在内存中的地址都是连续的。(摘自讲解中的话),因此我们只要找到令指针指向二维数组的首地址就能通过顺序来找到接下的元素。因为二维数组 a 的地址和 a [0] 是一样的,我们让 int *p=a[0],则可以找到首地址,调用过程中需要通过 *(p1+4*i+j) 来找接下来的元素。
#include<stdio.h>
void main()
{
int aa[3][4]={20,30,40,50,60,70,80,90,100,110,120,130},i,j;
int *p1=a[0];//[0]是地址
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)//
printf("%3d ",*(p1+4*i+j));
printf("n");
}
}
到此分析完毕。

c++如何打印一维数组首地址_C语言之二维数组和指针的结合相关推荐

  1. c语言二维数组存储坐标,C语言的二维数组在内存中的存放顺序

    C语言的二维数组在内存中的存放顺序 发布时间:2020-06-28 18:23:49 来源:亿速云 阅读:708 作者:Leah 这期内容当中小编将会给大家带来有关C语言的二维数组在内存中的存放顺序, ...

  2. c语言用二维数组打印空心菱形,java杨辉三角和空心菱形(二维数组篇)

    一.杨辉三角 import java.util.Scanner; //导入包 public class Test7 { public static void main(String[]args){ S ...

  3. Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)

    1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列). public  class Test {     public static void main(String[] arg ...

  4. 江哥带你玩转C语言| 12 -二维数组和字符串

    二维数组 所谓二维数组就是一个一维数组的每个元素又被声明为一 维数组,从而构成二维数组. 可以说二维数组是特殊的一维数组. 示例: int a[2][3] = { {80,75,92}, {61,65 ...

  5. c语言教程二维数组,C语言二维数组几种常用的表示方法

    名称:二维数组的几种表示方法 说明:常用的有以下几种二维数组的表示方法: (1).第一种是普通的二维数组的表示方法. (2).第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维 ...

  6. c语言数组赋值可以用scanf吗,二维数组怎么赋值 用scanf给二维数组赋值

    不知道行数列数的情况下,给一个二维数组赋值...... c语言二维数组的赋值: 例1: inta[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90}, ...

  7. C语言汇总学生成绩,c语言用二维数组统计学生成绩.doc

    c语言用二维数组统计学生成绩 # include /*定义一个求每门课平均成绩的函数AverageCourse 它的形参一个是二维数组,用来传递学生成绩: 一个是指针变量(数组名),存放每门课的平均成 ...

  8. C 语言之二维数组(详细版)

    目录 1.二维数组的定义和初始化 2.二维数组在内存中的存储 3.二维数组的使用 4.数组与函数 1. 二维数组是定义和初始化 1.1 二维数组的定义 定义类型:类型名 数组名[ 行表达式 ][ 列表 ...

  9. c语言——用二维数组名对二级指针赋值

    用二维数组名对二级指针进行赋值后,二级指针的指针运算操作是与二维数组的指针运算有区别的.通过下面的例子你将了解到二维数组与二级指针进行指针运算的本质区别. char array[3][4]={&quo ...

最新文章

  1. Zxing二维码开源项目
  2. python解析html模块_Python HTMLParser模块解析html获取url实例
  3. Ubuntu12.04安装小记
  4. 计算机网络——基本介绍
  5. oracle树结构统计,ORACLE 递归树型结构统计汇总
  6. 在两个Silverlight应用间数据通信(包括与Flash通信)
  7. 教育行业 A 股 IPO 第一股,如何做成程序员培训这门生意 | 极客头条
  8. python天下第一什么梗_「PHP 是最好的语言」这个梗是怎么来的?
  9. DaNet: Decompose-and-aggregate Network for 3D Human Shape and Pose Estimation
  10. 使用dmidecode查看服务器的内存条使用情况
  11. bzoj 4498: 魔法的碰撞(DP+组合数)
  12. 【转】你有这么一个人么
  13. SharePoint 2010 价格计算器
  14. excel删除行闪退_xp系统打开excel表格就闪退怎么回事_xp打开excel表格闪退如何解决...
  15. 哈工大车万翔团队:口语语言理解的最新进展与前沿
  16. 使用Excel在图片上添加正方形网格线
  17. SDX62出现WARNING: CPU: 0 PID: 8743 at net/netfilter/nf_nat_core.c:614 nf_nat_setup_info+0x8e4/0x900
  18. 【Android】程序包com.github.chrisbanes.photoview不存在
  19. ELG: An Event Logic Graph
  20. 数据结构[1]--学习--绪论(学习记录)

热门文章

  1. 记录webpack的source map使用详细说明
  2. 南京信息工程大学c语言真题,南京信息工程大学C语言试题库.doc
  3. C语言学习之输入任意年份,判断是否为闰年
  4. oracle反调试,突破前端反调试--阻止页面不断debugger
  5. Linux新手入门:Unable to locate package错误解决办法
  6. S5P4418/S5P6818核心板EMMC已由原来的4.5版本升级到5.1版本
  7. Data Warehouse Hardware - DW硬件需求计算
  8. 关于网络流sap算法
  9. 设计模式(七)适配器模式(Adapter Pattern)
  10. 作业 29 广义积分