鱼C论坛

 找回密码
 立即注册
查看: 2544|回复: 13

二维数组与指针

[复制链接]
发表于 2014-7-1 11:40:41 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 拈花小仙 于 2014-7-5 19:47 编辑

#include <iostream>
using namespace std;
int main()
{
    int a[2][3] = { {1,2,3}, {4,5,6} };
    int (*p)[3] = a;
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            cout << *(*(p + i) + j) << endl;  // *(p+i)好理解些,p的地址+i在解引用,
                                                                // 可    *(*(p + i)+j) 我就不明白了。*(p+i),*的优先级高于+
                                                                     运算符,
                                                               //那么一个解引用后的数字在+j   ?
                                                               // 推测下结果是能输出,可这该怎么解释呢?
        }
    }
    return 0;
}



最佳答案

查看完整内容

从形式上说,*(p+i)等价于p,暂时称此为公式1 所以,利用公式1,*(*(p + i) + j)等价于*(p+j), 再次利用公式1,*(p+j)又等价于p[j]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-1 11:40:42 | 显示全部楼层
从形式上说,*(p+i)等价于p[i],暂时称此为公式1
所以,利用公式1,*(*(p + i) + j)等价于*(p[i]+j),
再次利用公式1,*(p[i]+j)又等价于p[i][j]

评分

参与人数 1鱼币 +5 收起 理由
拈花小仙 + 5 真想把导师所有的回答都看一遍!

查看全部评分

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

使用道具 举报

发表于 2014-7-1 14:23:17 | 显示全部楼层
这是指针的知识。。我一直想说。。小仙。。你能不能不要学的太那个了。你看你。。指针基本知识都不会。。还去学java什么的。。。。没有意思。。。。学学API嘛。。windows程序设计。。这本书。。
这个是最基本的指针只是。。知道内存排列。。就很好懂了。。不知道耶好懂。。其实。。。
哎。。我就不解释了。。。真是的。。。你就不要这么浮躁了嘛。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-1 16:14:54 | 显示全部楼层
       “int (*P)[3]=a;”表示定义指向一维数组的指针变量,即行数组指针:
它表示,数组*p有3个int型元素,分别为(*p)[0]、(*p)[1]、(*p)[2]、(*p)[3] ,即p指向的是有3个int型元素的一维数组,即p为行指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-1 16:40:30 | 显示全部楼层

我都是边做题,有不懂的,查不到就问下哈,正好做到这题,这种用法很久以前就懂,但不能完全理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-1 16:41:04 | 显示全部楼层
hfut_wangfei 发表于 2014-7-1 16:14
“int (*P)[3]=a;”表示定义指向一维数组的指针变量,即行数组指针:
它表示,数组*p有3个int型元素 ...

还是不懂哦,小仙底子差
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-1 16:44:31 | 显示全部楼层
向往青莲 发表于 2014-7-1 14:23
这是指针的知识。。我一直想说。。小仙。。你能不能不要学的太那个了。你看你。。指针基本知识都不会。。还 ...

我从来没说学JAVA呀,我问下别的也只是为了开拓下眼界,学下学,了解是了解啦{:7_181:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-1 16:58:17 | 显示全部楼层
写了一下,看注释
#include <iostream>
using namespace std;
int main()
{
    int a[2][3] = { {1,2,3}, {4,5,6} };
    int (*p)[3] = a;


        int i,j;

        for (i = 0; i < 2; ++i)
    {
        for (j = 0; j < 3; ++j)
        {
            printf("a[%d][%d]=%d,0x%p\t" , i,j,a[i][j],&a[i][j]);
        }

                printf("\n");
    }
        printf("\n*******************************************\n");


        for (i=0;i<3;i++)
        {
                printf("(*p)[%d]=%d,0x%p\t" , i,(*p)[i],&((*p)[i]) );
        }


        printf("\np的值 0x%p\n",p);

        p++;

        printf("\np的值 0x%p\n",p);//看下内存的跨越值,为0xC 即 12,p指向的是3个整形组成的数组,12个字节

        printf("\n*******************************************\n");

        //理解这段打印结果,差不多就理解二维数组了
        int* pp = (int*)a;
        for (i=0;i<6;i++)
        {
                printf("%d,",*pp);
                pp++;
        }
        


        printf("\n*******************************************\n");


    for (i = 0; i < 2; ++i)
    {
        for (j = 0; j < 3; ++j)
        {
            cout << *(*(p + i) + j) << endl;  //一直只知道这么写,却一直没想通为什么,求详细的解答。
        }
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-1 18:16:49 | 显示全部楼层
仰望天上的光 发表于 2014-7-1 11:40
从形式上说,*(p+i)等价于p,暂时称此为公式1
所以,利用公式1,*(*(p + i) + j)等价于*(p+j),
再次利 ...

导师每次解答都通俗易懂,而且还能理解我们新手因技术低,问出的一些难理解的疑问。而且都是原创。小仙每次看到导师来答,都好激动哦!而且导师每次的解答都令我们技术低的人有所启发,告诉我们这题要组合起来看。真的好佩服导师。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-1 18:22:19 | 显示全部楼层
从形式上说,*(p+i)等价于p[i],暂时称此为公式1
所以,利用公式1,*(*(p + i) + j)等价于*(p[i]+j),
再次利用公式1,*(p[i]+j)又等价于p[i][j]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-1 18:24:48 | 显示全部楼层
戏++ 发表于 2014-7-1 16:58
写了一下,看注释

{:7_181:}太感谢了,可我技术比较差,看的不是很懂,导师那个太好懂了。有机会小仙会多多补偿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-1 19:08:26 | 显示全部楼层
拈花小仙 发表于 2014-7-1 18:24
太感谢了,可我技术比较差,看的不是很懂,导师那个太好懂了。有机会小仙会多多补偿

呵呵,不客气,导师讲的确实挺好,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-6 12:57:57 | 显示全部楼层
qq893161525 发表于 2014-7-1 18:22
从形式上说,*(p+i)等价于p,暂时称此为公式1
所以,利用公式1,*(*(p + i) + j)等价于*(p+j),
再次 ...

http://bbs.fishc.com/group-264-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-6 19:44:57 | 显示全部楼层
谢谢分享{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 14:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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