鱼C论坛

 找回密码
 立即注册
查看: 2027|回复: 5

多维数组指针

[复制链接]
发表于 2014-3-19 22:25:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码:
#include <stdio.h>
void main()
{
       int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11},(*p)[4];
       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,再作地址取值,有点说不过去吧

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-20 10:05:33 | 显示全部楼层
事实上朋友不妨把*(p+i)打印出来,你会发现他其实是个地址,因为对于二维数组而言是引用了两次指针的结果,你可以理解为a[3][4],第一个a[3]里边存放的都是地址,每个都是具有[4]个元素的初始地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-20 19:52:53 | 显示全部楼层

按我的理解F*取值符~~
P是指针变量,i是0
*(P+i)
明明就是取P+0的值的值~~
只果只是单纯取到P的值,就是跟*是取值符的概念差了一级啊~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-21 12:26:54 | 显示全部楼层
mack1983 发表于 2014-3-20 19:52
按我的理解F*取值符~~
P是指针变量,i是0
*(P+i)

是的呀,如果是p[3][4], *(p + i)这样是第一级别,得到的还是一个地址,需要在进行*处理才能得到第二级别的数据。
这问题*(p+i)这里存放三个地址,每个地址都包含四个元素,所以3 * 4 = 12总共可以存放12个元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-21 22:29:38 | 显示全部楼层
小甲鱼 发表于 2014-3-21 12:26
是的呀,如果是p[3][4], *(p + i)这样是第一级别,得到的还是一个地址,需要在进行*处理才能得到第二级别 ...

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

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

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

p2则取了两级的值,取到了值的值,那我是到底要怎么判断什么时候*值符是取一级的值什么时候是取二级的值?
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-23 11:10:23 | 显示全部楼层
mack1983 发表于 2014-3-21 22:29
你说的模式理解为是,
基地址+行偏移+列偏移

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

这里p2可以取到值而p1取到的确实0的原因是,如果你需要对p1的值进行取出,需要进行二次取,即**p1,否则得到的是一个地址(因为你是二维数组,第一维存放地址,第二维存放数据)。
这么说,*p1打印的值与直接打印a[0]等同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 00:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表