西西河

主题:【求助】向各位高手请教一个c语言中数组与指针的问题 -- 数值分析

共:💬84 🌺26 新:
分页树展主题 · 全看首页 上页
/ 6
下页 末页
        • 家园 用法不同吧

          我以前做得项目用的基本都是C。已经有两年多没有碰这种指针运用了。

          如果我记得没错,以int* 方式传过去的,都可以向我说的那样用。a+1这种我还没有正经用过。

          • 家园 呵呵,没错。我们一般也就和老兄说的那样,用个int *

            a+1这种用法只是在讨论理论的时候提提,一般不会用。太乱。

      • 家园 del
        • del
          家园 可以试试强制类型转换

          比如

          int *p = (int*)a;

          应该是可以的。

          指针说白了就是一个里面放着地址的变量。啥地址不是地址啊

          此时a应该是一个“指向数组的指针”类型的常量。

          • 家园 del
            • del
              家园 指针里面放的就是地址

              只不过它知道(或者说它认为自己知道)自己要指向的是个什么类型的玩意儿。(其实确切的说是编译器认为)

              还是先确定下角色吧,这样好说。

              路人甲:int a[3][4];

              路人乙:int *p;

              a知道每行的宽度,是因为您交待它了,它的“基类型”是一个有4个元素的int数组。也就是说这时它就认为自己指的东西有4*4byte那么长。所以您让他+1,他自己就找下一个了。也就是给自己所存的数(就是地址)加上了个16。所以您看到a+1就是a[1]也就是数组第二行的地址。

              但是

              p=(int *)a

              的时候,您交待a了,这会儿你不能跟p说你是个数组指针,要这么说它就不跟你玩儿了。你就跟他说你是个int指针。反正都是地址,那家伙瞧不出来

              于是,p就从了……

    • 家园 int **x是用来实现指针数组这类功能的

      指针指向地址里存的还是个指针,而二维数组里存的都是整型。两个概念完全没关系,让大家如何给你解释?

      • 家园 花一个。我觉得LZ的困惑可能来自

        对于 int** x 和 int a[m][n], x[i][j]、a[i][j]、x[i]、a[i]在C语言中都是合法的表达式,于是认为二者可以套用。LZ可能不知道在C语言编译时:

        (1) x[i] = *(x+i),x[i][j] = *( *(x+i) + j )

        (2) a[i] = (int *)a + i*n,a[i][j] = *( (int *)a + i*n + j )

        或者

        (2) a[i] = (int *)(a + i),a[i][j] = *( (int *)(a + i) + j )

        Example: x[0][0]=*(*(x)), a[0][0]=*( (int *)a ).

        Note: a[0][0] != *(a). Why? Test yourself.

        -----------更正-----------------------

        上述内容本身没有错误,但作为LZ原问题的解释不合适。事实上:对于二维数组a,下面与二维指针类似的表达式也是成立的,即:a[i]=*(a+i), a[i][j]=*(*(a+i)+j),a[0][0]=**a。我在frnkl:这个问题实在很有趣里给出了一个代码示例,可以解释LZ的原问题。

        非常抱歉。


        本帖一共被 1 帖 引用 (帖内工具实现)
    • 家园 del
    • 家园 使用指针的时候自己一定要清楚p+1到底是加了几

      也就是说一定要清楚指针的“基类型”,p+1就是让指针p指向下一个“基类型”元素。

      另外,二维数组和一维数组一样,就是个内存块。一堆同类型的数据排队站在一起而已。

      具体到您的例子,一堆int挤在一起,那就用int *a来访问就好了。

      可以在f1参数表中定义a是int *a

      然后就可以在f1中用*(a+i*m+j)或者a[i*m+j]来访问a[i][j]了(设数组为m*n阶)

    • 家园 是这样

      如果二维指针与数组等价的话,要计算x[i][j]先要算x[i]=x+i*K,其中K是最后一维的维数。但你子函数中是无法得到K的值的。这是为什么说(int **)与二维数组a不是一个类型的原因之一

      ----------------Update-----------------------

      至于x[0][0]为什么与a[0][0]值不同,是因为x[0]的值与a[0]不同,所以x[0][0]与a[0][0]值不同。

      --------------再啰嗦几句----------------------

      你可以查一下,a的值与a[0]的值是相同的,但x与x[0]的值是不同的。为什么?x[0]是x的值指向的地址上的值(读多少位由int*的长度决定),而a[0]的值就是a。

      ------------一般情况下的讨论------------------

      非吾有:原因是这样的(详见内)frnkl:理解了二维array多维array就没问题了

      -----------代码例子---------------------------

      frnkl:试试这段代码。这个例子也很好熊熊熊熊:更详细的例子...

分页树展主题 · 全看首页 上页
/ 6
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河