拈花小仙 发表于 2014-7-1 11:40:41

二维数组与指针

本帖最后由 拈花小仙 于 2014-7-5 19:47 编辑

#include <iostream>
using namespace std;
int main()
{
    int a = { {1,2,3}, {4,5,6} };
    int (*p) = 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;
}



C++编程小组

仰望天上的光 发表于 2014-7-1 11:40:42

从形式上说,*(p+i)等价于p,暂时称此为公式1
所以,利用公式1,*(*(p + i) + j)等价于*(p+j),
再次利用公式1,*(p+j)又等价于p

向往青莲 发表于 2014-7-1 14:23:17

这是指针的知识。。我一直想说。。小仙。。你能不能不要学的太那个了。你看你。。指针基本知识都不会。。还去学java什么的。。。。没有意思。。。。学学API嘛。。windows程序设计。。这本书。。
这个是最基本的指针只是。。知道内存排列。。就很好懂了。。不知道耶好懂。。其实。。。
哎。。我就不解释了。。。真是的。。。你就不要这么浮躁了嘛。。。

hfut_wangfei 发表于 2014-7-1 16:14:54

       “int (*P)=a;”表示定义指向一维数组的指针变量,即行数组指针:
它表示,数组*p有3个int型元素,分别为(*p)、(*p)、(*p)、(*p) ,即p指向的是有3个int型元素的一维数组,即p为行指针

拈花小仙 发表于 2014-7-1 16:40:30

向往青莲 发表于 2014-7-1 14:23 static/image/common/back.gif
这是指针的知识。。我一直想说。。小仙。。你能不能不要学的太那个了。你看你。。指针基本知识都不会。。还 ...

我都是边做题,有不懂的,查不到就问下哈,正好做到这题,这种用法很久以前就懂,但不能完全理解。

拈花小仙 发表于 2014-7-1 16:41:04

hfut_wangfei 发表于 2014-7-1 16:14 static/image/common/back.gif
“int (*P)=a;”表示定义指向一维数组的指针变量,即行数组指针:
它表示,数组*p有3个int型元素 ...

还是不懂哦,小仙底子差

拈花小仙 发表于 2014-7-1 16:44:31

向往青莲 发表于 2014-7-1 14:23 static/image/common/back.gif
这是指针的知识。。我一直想说。。小仙。。你能不能不要学的太那个了。你看你。。指针基本知识都不会。。还 ...

我从来没说学JAVA呀,我问下别的也只是为了开拓下眼界,学下学,了解是了解啦{:7_181:}

戏++ 发表于 2014-7-1 16:58:17

写了一下,看注释#include <iostream>
using namespace std;
int main()
{
    int a = { {1,2,3}, {4,5,6} };
    int (*p) = 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,&a);
      }

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


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


        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;
}

拈花小仙 发表于 2014-7-1 18:16:49

仰望天上的光 发表于 2014-7-1 11:40 static/image/common/back.gif
从形式上说,*(p+i)等价于p,暂时称此为公式1
所以,利用公式1,*(*(p + i) + j)等价于*(p+j),
再次利 ...

导师每次解答都通俗易懂,而且还能理解我们新手因技术低,问出的一些难理解的疑问。而且都是原创。小仙每次看到导师来答,都好激动哦!而且导师每次的解答都令我们技术低的人有所启发,告诉我们这题要组合起来看。真的好佩服导师。

qq893161525 发表于 2014-7-1 18:22:19

从形式上说,*(p+i)等价于p,暂时称此为公式1
所以,利用公式1,*(*(p + i) + j)等价于*(p+j),
再次利用公式1,*(p+j)又等价于p

拈花小仙 发表于 2014-7-1 18:24:48

戏++ 发表于 2014-7-1 16:58 static/image/common/back.gif
写了一下,看注释

{:7_181:}太感谢了,可我技术比较差,看的不是很懂,导师那个太好懂了。有机会小仙会多多补偿

戏++ 发表于 2014-7-1 19:08:26

拈花小仙 发表于 2014-7-1 18:24 static/image/common/back.gif
太感谢了,可我技术比较差,看的不是很懂,导师那个太好懂了。有机会小仙会多多补偿

呵呵,不客气,导师讲的确实挺好,学习了

拈花小仙 发表于 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

xiaver 发表于 2014-7-6 19:44:57

谢谢分享{:1_1:}
页: [1]
查看完整版本: 二维数组与指针