主题:【求助】向各位高手请教一个c语言中数组与指针的问题 -- 数值分析
在f()中,x接受的是b的首地址,不是“只收到了&a[0][0](用**x来接收)”。
不过说“第一行”有点不太确切。如果机器中(int*)与(int)分配的空间一样大,“第一行”应该改为“第一个”。程序崩溃是没得跑的。
*(x+1)比*(x)大16是因为b[1]-b[0]=4*4=16。
另外,“printf("%d\n",x[0][0]); // =8”的输出应该是0。
看来你应该回头仔细读一下非吾有:原因是这样的(详见内)。那篇帖子里最拗口的几句最关键,如果你能读明白,问题就解决了。
是实践检验的问题。一个解释站不站得住,要看它的预期结果是不是与实践吻合。
我表达可能有些问题,造成我的意思传递不出去。多么希望能有老萨的好笔头啊。
小熊DD/MM你还是没明白非吾有的帖子,只是你认为自己明白了。
不过较真的精神可嘉,应该鼓励。
指针指向地址里存的还是个指针,而二维数组里存的都是整型。两个概念完全没关系,让大家如何给你解释?
对于 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 帖 引用 (帖内工具实现)