mack1983 发表于 2014-3-19 22:25:41

多维数组指针

代码:
#include <stdio.h>
void main()
{
       int a={0,1,2,3,4,5,6,7,8,9,10,11},(*p);
       int i,j;
       p=a;
       for (i=0;i<3;i++)
       {
            for (j=0;j<4;j++)
            {
                  printf("%-5d",*(*(p+i)+j));
            }
       printf("\n");
       }
}

问题在这里:
*(*(p+i)+j));
这句话就是取p+i的值的值+j,再取p+i的值的值+j的值?
p的值是数组首地址,首地址+i偏移地址的值,己经是一个具体的值了,再+j,再作地址取值,有点说不过去吧

小甲鱼 发表于 2014-3-20 10:05:33

事实上朋友不妨把*(p+i)打印出来,你会发现他其实是个地址,因为对于二维数组而言是引用了两次指针的结果,你可以理解为a,第一个a里边存放的都是地址,每个都是具有个元素的初始地址。

mack1983 发表于 2014-3-20 19:52:53

小甲鱼 发表于 2014-3-20 10:05 static/image/common/back.gif
事实上朋友不妨把*(p+i)打印出来,你会发现他其实是个地址,因为对于二维数组而言是引用了两次指针的结果, ...

按我的理解F*取值符~~
P是指针变量,i是0
*(P+i)
明明就是取P+0的值的值~~
只果只是单纯取到P的值,就是跟*是取值符的概念差了一级啊~

小甲鱼 发表于 2014-3-21 12:26:54

mack1983 发表于 2014-3-20 19:52 static/image/common/back.gif
按我的理解F*取值符~~
P是指针变量,i是0
*(P+i)

是的呀,如果是p, *(p + i)这样是第一级别,得到的还是一个地址,需要在进行*处理才能得到第二级别的数据。
这问题*(p+i)这里存放三个地址,每个地址都包含四个元素,所以3 * 4 = 12总共可以存放12个元素。

mack1983 发表于 2014-3-21 22:29:38

小甲鱼 发表于 2014-3-21 12:26 static/image/common/back.gif
是的呀,如果是p, *(p + i)这样是第一级别,得到的还是一个地址,需要在进行*处理才能得到第二级别 ...

你说的模式理解为是,
基地址+行偏移+列偏移

最后再取值~但一加*取值符就是取值的值了啊~~

如下图同样的格式
p1只取了一级的值,P1自身的值

p2则取了两级的值,取到了值的值,那我是到底要怎么判断什么时候*值符是取一级的值什么时候是取二级的值?

小甲鱼 发表于 2014-3-23 11:10:23

mack1983 发表于 2014-3-21 22:29 static/image/common/back.gif
你说的模式理解为是,
基地址+行偏移+列偏移


这里因为你并没有指定p1是多少“行”,所以编译器不会自动去计算,所以初始值都是0x0012ff50,后边你带了,因此分成四“列”,二维数组只是模拟的二维,事实上他的存放原理依旧是线性的。

这里p2可以取到值而p1取到的确实0的原因是,如果你需要对p1的值进行取出,需要进行二次取,即**p1,否则得到的是一个地址(因为你是二维数组,第一维存放地址,第二维存放数据)。
这么说,*p1打印的值与直接打印a等同。
页: [1]
查看完整版本: 多维数组指针