淘客熙熙

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

共:💬84 🌺26
分页树展主题 · 全看首页 上页
/ 6
下页 末页
    • 家园 二维数组和二维指针是两码事

      二维或多维数组本质上仍是一维数组,a[5][5]等于一个长25的一维整数组。而二维指针指向一个地址序列。把a[5][5]强制转换成int**,实际是把第一行数据强制作为指针来使用,能引起程序崩溃。

      你可以试一下,把a强制转换为一维指针,然后用[i*5+j]来访问a[i][j],应当是可以的

    • 家园 数组只能认为是指针,不能认为是递指针;

      递归指针的意思,指针指向的地址保存着另一个指针。而在任意多维数组中,以数组名作为指针找到的是第一个元素的值。最佳的解决办法只能把第一维的尺寸用参数传递进去。

    • 家园 考虑另一个方法呢

      定义子函数为

      void f1(int *x[])

      {

      ......

      }

    • 家园 原因是这样的(详见内)

      C语言对于指针变量以下标操作取值实质上是这样做的。如果有,

      int *x;

      则x[m] 实际上是取地址(x+m*int长度)处的整数值

      而对于int **y

      则y[m][n] 实际上是取地址 (y+m*(int*长度))中的值后,再加上n*int长度的值,以新值做为一个地址再取该地址中的值。

      而对于二维数组int a[h][c],

      a[m][n]是取地址 a+m*c*int长度 + n*int长度处的整数值。

      也就是说,你例中的x[0][0]实质上为

      *(*(x))所以其值与你预期的不一致。

      ------------------

      附注:第一次a[m][n]的计算公式写错。现予更正

      另外frnkl朋友指出y[m][n]计算公式中的错误,也已改正。谢谢frnkl。


      本帖一共被 2 帖 引用 (帖内工具实现)
      • 家园 【讨论】笔误?

        则y[m][n] 实际上是取地址 (y+m*int长度)中的值后,再加上n*int长度的值,以新值做为一个地址再取该地址中的值。

        这个“(y+m*int长度)”是不是应该为“(y+m*(int*)长度)”?前一个*是乘号,后面(int*)指存放int型数据的指针。

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


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

Copyright © cchere 西西河