西西河

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

共:💬84 🌺26 新:
全看树展主题 · 分页首页 上页
/ 6
下页 末页
del
家园 答案

实,在f()中,只收到了&a[0][0](用**x来接收), b[1]=&a[1][0];应该对f()没有影响. 为什么在main 中执行 b[1]=&a[1][0];之后,会影响f() ???

在f()中,x接受的是b的首地址,不是“只收到了&a[0][0](用**x来接收)”。

家园 说得很到位,花枝。

把a[5][5]强制转换成int**,实际是把第一行数据强制作为指针来使用,能引起程序崩溃

不过说“第一行”有点不太确切。如果机器中(int*)与(int)分配的空间一样大,“第一行”应该改为“第一个”。程序崩溃是没得跑的。

答案
家园 del
家园 del
家园 del
家园 del
del
家园 最后解释一次

*(x+1)比*(x)大16是因为b[1]-b[0]=4*4=16。

另外,“printf("%d\n",x[0][0]); // =8”的输出应该是0。

看来你应该回头仔细读一下非吾有:原因是这样的(详见内)。那篇帖子里最拗口的几句最关键,如果你能读明白,问题就解决了。

家园 del
del
家园 这不是辩论的问题

是实践检验的问题。一个解释站不站得住,要看它的预期结果是不是与实践吻合。

我表达可能有些问题,造成我的意思传递不出去。多么希望能有老萨的好笔头啊

家园 del
del
家园 要我说

小熊DD/MM你还是没明白非吾有的帖子,只是你认为自己明白了。

不过较真的精神可嘉,应该鼓励

家园 del
家园 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
家园 看看这篇解释得清楚吗

frnkl:花一个。我觉得LZ的困惑可能来自

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


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

Copyright © cchere 西西河