C语言中如何用指针运算符来表示一个二维数组的元素及地址?

*(*(a+i)+j)、*(a[i]+j)、(*(a+i))[j]为什么都表示元素a[i][j]?*(a+i)+j、a[i]+j又为什么都表示a[i][j]的地址?虽然可以死记格式,但我想知道原理,以及有什么办法来区分指针表示的到底谁元素还是地址?

二维指针,就是说第一维是指针,第二维还是指针;
拿*(*(a+i)+j)来说:a是数组的首地址吧,然后+i,就是说a地址向后偏移i位。就是a+i的地址了,注意,这里a+i只是地址,用*符号取出该地址的数据,就是*(a+i),这里*(a+i)就是第一维指针,它指的是地址,不是数据。
而且后面的*(a+i)+j就是说以*(a+i)为首地址,偏移j位,然后使用*取内容,这里就是第二维了,取到的数据就是实际数据了追问

*(a+i)不是取出指针所指数据么?为什么说又是指地址?

追答

因为这是二维指针啊

*(a+i)是指针的数据,例如0x1234,但是0x1234只是代表数据,你需要再*一下,相当于去0x1234的地址去拿 数据,这里的数据才是你要的

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-07-22
首先你得知道a就是数组第一个元素的地址,而二维数组a[i][j]可以理解为a[i]数组每个元素储存的是一个j个元素大小的另一个数组,这样理解的话,先说*(*(a+i)+j),a+i就不说了相当于被重载操作符一样,指针+1的含义就是加一个单位的数据大小,然后*(a+i)则相当于a[i]的值对吧,而a[i]的值就是下一个数组的指针现在源代码相当于*(a[i]+j),然后自己分析吧,很简单的,不过说实话没必要真么纠结,真写代码没多少人闲的蛋疼真么写的,给自己制造麻烦不说,后期维护也会很痛苦的
第2个回答  2015-07-22

c语言里面怎么用指针表示二维字符数组
二维数组就是数组的数组,二维数组即数组的元素是一维数组的数组。那么我们要用指针指向二维数组,就是要定义一个指向数组的指针了。例如:char str[3][10]; \/\/定义了一个char型的二维数组 char (*pstr)[10]; \/\/定义了一个指向char型的数组指针 pstr=str; \/\/指针指向二维数组str 下面用pstr这...

C语言如何定义指针指向字符型二维数组
1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素 int a[3][4];int *p;p=&a[0][0];\/\/因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素 该二维数组的任意i行j列元素可表示为*(p+i*4+j)。2.使用行指针:定义一个...

C语言 怎么用指针输出一个二维数组的全部值
C语言的数组(不管多少维)在内存中都是线性储存的。所以用一级指针加偏移就可以访问所有元素。举个例子,有一个10*10的二维数组a,这样就可以输出:int a[10][10];int *p = (int *)a;int i;for (i = 0; i < 10 * 10; i++)printf("%d", *(p + i));

C语言怎么定义一个字符指针指向一个二维字符数组的首地址
二维数组也是“数组的数组”所以定义一个指向由m个元素组成的一维数组指针即可指向二维数组的首元素地址。如:char arr[2][2] = { { 'a', 'b' }, { 'c', 'd' } };char (*p)[2];p=arr; \/\/ p指向首元素地址。char c = *(p[0]+ 1);\/\/ 指向0行1列 即字符b ...

求c语言指针方式引用二维数组问题
a[0]代表第一组首元素地址,当然,a[0]也指向数组首元素的地址,a[0]=&a[0][0];a是对a取值,它取出的是a[0],当然=&a[0][0];&a[0]指a[0]的地址,还是它自己,所以&a[0]=&a[0][0]。所以,第一行个打印语句输出的5个内容都是一样的,所以,输出5个19ff0c。是a[0][0...

C语言求一个二维组每行每列的最大值 并放在一个新数组中 ,用指针做?
既然你要用指针来做,我就用指针来写。利用数组元素地址连贯性来做。include <stdio.h> define MXR 4\/\/最大行数 define MXC 3\/\/最大列数 int main(){ int i=0,mr,mc,*p=NULL,*ps=NULL;int nums[MXR][MXC]={{8,6,7},{2,6,3},{1,4,2},{9,3,5}};int mrs[MXR],mcs[MXC...

使用列指针输出二维数组元素
在C语言中,数组是不同于普通变量的,实际上C定义的数组是指向该数组第一个元素的指针。这是第一个概念,即数组名就是指针,所以可以直接当做指针来用,例如:对于一个数组a[],要取其第三个元素的值,既可以用a[2],也可以用a+2来访问。对于一个二维数组,如果用下标变量来表示的话,则可以...

C语言程序设计中"二维数组中元素指针的表示"的例题,求详解
⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了。而每个大数组...

C语言中二维数组的指针问题
&a[0][0] 也是指0行0列的元素地址 p=&a[0][0] 它的意思的使指针p指向数组a的第0行第0列,而在后面执行p++的时候,就会使指针顺序后移,依次指向 a[0][1] a[0][2]……a[2][2] 的地址;假如:p=a 这是使指针p指向数组a的首行,当你输出*p这个值的时候,它输出的值是a[0...

C语言中二维数组行指针是什么
第一,来详细介绍二维数组与指针的关系。- 首先定义个二维数组 array[3][4],p 为指向数组的指针。若p=array[0],此时p指向的是二维数组第一行的首地址,则 p+i 将指向array[0]数组中的元素array[0][i]。由以上所介绍的二维数组在内存中的存储方式可知,对数组中的任一元素array[i][j] ,...

相似回答