西西河

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

共:💬84 🌺26 新:
全看树展主题 · 分页首页 上页
/ 6
下页 末页
家园 del
家园 这个靠谱....
del
家园 试试这段代码

void f1( int ** x )

{

printf("%d\n",x[0][0]);

}

void main()

{

int a[4][4];

int *b[4];

a[0][0]=99;

a[1][0]=10;

a[2][0]=-666;

b[0]=&a[0][0];

b[1]=&a[1][0];

b[2]=(int *)(a+2);

f1( b );

f1(b+1);

f1(b+2);

}

不过我们说的可能不是一个问题。


本帖一共被 1 帖 引用 (帖内工具实现)
家园 谢谢指正,马上修改。
家园 使用指针的时候自己一定要清楚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阶)

家园 花一个。再稍微改它一改,哈哈。

是(int*)不是(*int)(我一开始也打错了!)

del
家园 理解了二维array多维array就没问题了

一个关键之处是array(包括任何维)的名字不能做变量,就是说,名字本身不能放在等号的左边。如果是三维的array,记住array[i]和array[i][j]也都不是变量,只有array[i][j][k]是。其它高维情况类推。

更关键的是高维指针与高维array的区别。其实LZ的问题可以抽象为:定义int **x, int a[m][n],怎样才能使x[i][j]=a[i][j]?很简单,必须首先赋值使x[0]=&a[0][0],x[1]=&a[1][0],...,x[m-1]=&a[m-1][0](或者等价的,x[0]=a,x[1]=a+1,...,x[m-1]=a+m-1)。令x=a达不到上述目的。


本帖一共被 1 帖 引用 (帖内工具实现)
家园 del

del
家园 把 f1(b+2);这句去掉就没问题了。
家园 del
del
家园 因为

b[0]=&a[0][0]推不出b[1]=&a[1][0]。在你的例子中,b[1]作为一个指针未被赋值,指针未被赋值就使用有什么后果应该知道吧。

再说一遍吧:b是指针变量,它的值是一个指针变量的地址;b[i]也是一个指针变量,它的值是一个整数变量的地址。a本身不是变量,你可以把它看做二维数组头地址的缩写;a[i]是数组a第i行头地址的缩写,不是变量。&a[i]导致语法错误,而&b[i]是合法的,它的值等于b+i *(int* 的长度);作为对照:a[i](不是&a[i])的值等于a+i * K *(int 的长度),其中K是最后一维的维数。麻烦的是C语言中上述两个值的表达式非常相似,分别是b+i和a+i。哈哈,头疼了吧。

因为
家园 del
del
家园 del

本帖一共被 2 帖 引用 (帖内工具实现)
del
家园 你的例子很好

b在你的例子(熊熊熊熊:更详细的例子...)中是指针array,当你把它的首地址传递给子函数的x后,x[0]=b[0],x[1]=[1],以此类推。其实这已经是一维指针与array的函数调用问题了。既然你的b[1]=&a[1][0],所有其它问题就很好理解了。

家园 脸红中
全看树展主题 · 分页首页 上页
/ 6
下页 末页


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

Copyright © cchere 西西河