C语言中指针与二维数组的问题!

指针与二维数组!

声明一个int型的二维数组a[2][3],并将起始值指定给指针变量*pia:
int a[2][3];
int *pia=&a[0][0];
如果要使用指针变量*pia来存取二维数组中的第i列第j行元素,也就是a[i][j].可以使用以下公式来取出该元素的值.
*(pia+i*3+j);
例如:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int *pia=&a[0][0];
int i,j;

for(i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%d\t",*(pia+i*3+j));
putchar('\n');
system("pause");
return 0;
}
那么公式*(pia+i*3+j)到底是什么意思呢?
为什么要乘以3呢?到底*是取值还是乘号?
一直看不懂这个公式,麻烦高手详细解答一下吧,求知!
一定要详细哟,我老笨老笨的啦.....

第1个回答  2009-06-11
第一个*表示解引用,即取指针指向的值。
i表示行号,j表示列号,并且都是从0开始取值,乘3表示每行3个元素。举个例子,假定i等于0, j等于2,i*3+j=2,计算结果就是第一行的最后一个元素,最后将数组的首地址加上数据的偏移从而得到数据的地址。
第2个回答  2009-06-11
公式*(pia+i*3+j)的意思就是a[i][j]的意思 二维数组是矩阵排列的 在内存空间里面是先存第一行 再存第二行 以次类推(内存空间是一条链的形式) 行为i列为j 第0行就是0*i 然后加上j的数值 第1行就是1*i 然后加上j 所以 一样可以定位
3*i的*是乘号
第3个回答  2009-06-12
pia+i*3+j是地址,代表从首元素开始第i*3+j个元素的地址,pia指向的a[2][3],一行有3个元素,所以a[i][j]的地址是pia+i*3+j,前面*是取内容!pia为int型,pia每加1代表地址加2,就是加了一个元素的地址
第4个回答  2009-06-11
*(pia+i*3+j)指读取从pia开始第i*3+j个位置的值。
因为你的a是一个2×3的数组,也就是a[i]代表一个有着三个元素的整数数组。在内存里二维数组是按照从高到低从左到有的顺序连续排列的,以你的数组为例:
1 2 3
4 5 6
那么在内存里这些的排列顺序就是1 2 3 4 5 6,而pia所指的就是1的位置。
所以i*3+j就给出了从数组开头第i*3+j个元素的位置,也就是a[i][j]的位置。

如果*是放在数字变量和常量的中间,它就代表乘号。如果放在一个指针变量的前面就代表提取符,pia+i*3+j给出了一个新的指针,用*提出它所指的值。本回答被提问者采纳
第5个回答  2009-06-11
第一个*是取里面的值 第二是乘
你不是定义了 a[2][3]嘛 意思就是两行三列

C语言中二维数组行指针是什么
对于二维数组array[4][3],与int* p 。二维数组名array 不能直接赋值给p。原因前面已讲过,两只的对象性质不同。 在C语言中,可以通过定义一个行数组指针,使得这个指针与二维数组名具有同样的性质,实现它们之间可以直接赋值。行数组指针定义如下:int (*p)[3]; 它表示,数组 *p 具有三个int类型...

求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 语言指针的指针和二维数组的区别?
指针的指针和二维数组完全俩东西,二维数组是 一维数组的一维数组,元素是数组,所以可以隐式转化为int (*)[3],跟int **两回事,扩展到更多维或其它类型也是成立的,只能隐式转化为第一维的元素的指针 补充说明下隐式转化为指针,简单说就是这样(T是任意类型)设有一个数组T a[10];a的类型是“...

C语言中二维数组名能否直接赋给指针变量
二维数组的指针与指针的指针是不一样的。所以 int **ppr;int fool[2][3];ppr = fool;这样是不行的。二维数组的指针必须限定第一维的大小。所以:int (*ppr)[3];ppr = fool;这样才可以。

C语言指针问题
由于二维数组的逻辑结构是一维空间,存储结构是二维空间,因此可以分别按照存储结构和逻辑结构定义指向二维数组的指针.二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。如果有:int a[M][N];则将二维数组中的元素a[i][j]转换为一维线性地址的一般公式是:...

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

C语言中二维数组名是不是可以看作指针数组名?
不可以,二维数组要看做“数组的数组”。(以如下定义为例:int a[4]; int * p;)给你个对于指针和数组的正确理解吧:定义的不同:C 里,指针和数组是不同的类型,不要把数组名看做“常指针”。所以 sizeof(a) 和 sizeof(p) 值是不同的。容易被混淆的原因:a. 都有基础类型。b. 数组...

C语言函数调用二维数组,指针问题
deal(int (*p)[10])就不一样了,编译器就能知道p是一个指向长度为10的数组的指针 那么p[2][3]就能编译成*(p+2*10+3)了 总之,C语言是很灵活的,不同的定义方式配上不同的用法,都是能得到正确的结果的 不知道这么说楼主明白了没?同样的还有多维数组对多维指针的问题,楼主可以自己类推一下 ...

二维数组和指针的一个疑问。
a是一个二级指针,也成为行指针。它是一个常量指针。对a操作就使指针指向其他行。比如a+1就指向了第一行。a是一级指针,(a+1)是第一行首个元素的地址,相当于于a[1]。a是内容。(*(a+1)+1)是第一行第一个元素,相当于a[1][1]。这里a与*a相同,可以类比为一个函数int max()和一个...

相似回答