二维数组中数组名与其指针的关系

大多数初学者不是很清楚二维数组是个怎样的存在,今天我就来说说这个二维数组,计算机内存是一连串的存储单元,我们可以把它理解成一条线,没错就是一条线,那么问题来了,二维是个怎样的存在呢???说白了,二维数组并不真是二维,只是人们主观的将它变成二维,举个例子吧!比如楼梯,我们都知道楼梯说白了就是一条路,但是我们刻意将楼梯来回上升的方式,这都是我们主观的改变,实际上我们可以看成是一个直路,只是被工人弄弯了。好了,不扯了,进入主题。。。。

二维数组名a是数组第一行的指针,它指向的是一整行,*a才是a[0][0]的地址,数组名a是一整行地址,*a是一个元素的地址,但此时p=a,这个p却是a[0][0]的地址看下面的程序

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5     int a[2][3]={1,2,3,4,5,6},*p;
 6
 7     p=a;
 8
 9     printf("%d %d %d\n",p,a,*a);
10
11     return 0;
12 }

结果显示

第一行的地址和第一个元素首地址肯定相同,我们继续看

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5     int a[2][3]={1,2,3,4,5,6},*p;
 6
 7     p=a;
 8
 9     printf("%d %d\n",(p+1),*(a+1));
10
11     return 0;
12 }

结果显示,可以看出,地址差异出来了,第0行的地址为6487600,所以a[0][1]就是6487600,而第一行的地址为6487612,是不是相差了3个int型字节,所以这就证明了a是数组第一行的指针,它指向的是一整行,p指向的是一个元素

继续证明

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5     int a[2][3]={1,2,3,4,5,6},*p;
 6
 7     p=a;
 8
 9     printf("%d %d\n",*(p+1),**(a+1));
10
11     return 0;
12 }

结果

结论:**a才表示a[0][0],*a表示a[0][0]的地址,a表示第一行的地址

时间: 2024-12-18 10:22:42

二维数组中数组名与其指针的关系的相关文章

在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10]; for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { if(i==j||i+j==9) { y[i][j]='*'; } else { y[i][j]='#'; } } } for(int i =0;i<10;i++) { for(int k

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 269 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一

USACO5.3 IDDFS_强连通_二维树状数组_斐蜀定理_矩形切割

启发式搜索 启发式搜索的主要思想是通过评价一个状态有"多好"来改进对于解的搜索. 方法#1:启发式剪枝 估价函数最简单最普通的用法是进行剪枝.假设有一个求最小代价的一个搜索,使用一个可行的估价函数.如果搜到当前状态时代价为A,这个状态的估价函数是B,那么从这个状态开始搜所能得到的最小代价是A+B.如果当前最优解是C满足C 方法#2:最佳优先搜索 最佳搜索可以看成贪心的深度优先搜索. 与一般搜索随意扩展后继节点不同,最优优先搜索按照估价函数所给的他们的"好坏"的顺序扩

C语言malloc函数为一维,二维,三维数组分配空间

c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请所取空间的大小,因为没有在声明部分定义它们为变量或数组,所以不能通过变量名或数组的方式去引用这些数据,只能通过指针来引用. 对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数. 接下来写一下malloc函数如何实现为一维,二维,三维数

HDOJ 4456 Crowd 离散化+二维树状数组

将坐标旋转45度就可以得到正方形,可以用二维树状数组求解... 为了节省内存,提前将树状数组中会被更新的点全都存下来,并离散化 Crowd Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1199    Accepted Submission(s): 282 Problem Description City F in the south

POJ1195 Mobile phones 【二维树状数组】

Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14288   Accepted: 6642 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The

tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着身体. 描述 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵.第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作.第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作.第

hdu 5517 Triple(二维树状数组)

题目链接:hdu 5517 Triple 题意: 有n个两元组A,有m个三元组B,然后set C有一个计算方式. 现在让你找set TOP的size. 题解: 理解题意后,显然对于每个b的分组,只有最大的a才有贡献, 然后就可以发现set B中每个元素按照e分组后,只会对应一个a,所以最多有1e5个三元组可能有贡献. 然后将这个三元组排一下序,用二维树状数组搞搞就行了. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=(a);i&l

hdu6078 Wavel Sequence dp+二维树状数组

//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:给定a序列和b序列.从a中取一个子序列x(数的位置顺序保持不变),子序列每个数满足a1<a2>a3<a4>a5<a6... 波浪形 从b中取相同长度的子序列y,也满足波浪形. 如果x

二维树状数组复习—— SuperBrother打鼹鼠

在这个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……).洞口都在一个大小为n(n< =1024)的正方形中.这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1).洞口所在的位置都是整点,就是横纵坐标都为整数的点.而SuperBrother也不时地会想知道某一个范围的鼹鼠总数.这就是你的任务. 输入 每个输入文件有多行. 第一行,一个数n,表示鼹鼠的范围. 以后每一行开头都有一个数m,表示不同的操作: m=1,那么后面跟着3个数x,y