二维数组做为参数的问题

bool FindNum(int *arr,int columns,int rows,int nFindNum)
{
if(NULL != arr && rows > 0 && columns > 0)
{
int m_row = 0;
int m_column = columns-1;
while(m_row < rows && m_column >=0 )
{
if(nFindNum == arr[m_row *columns + m_column])
{
return true;
}
if(arr[m_row * columns + m_column] > nFindNum)
{
m_column--;
}
else
{
m_row++;
}
}
}
return false;
}

int main()
{
int arr[4][4] = {1,2,8,9,
2,4,9,12,
4,7,10,13,
6,8,11,15};
为什么调用时FindNum(*array ,4,4,7); 而不是FindNum(array ,4,4,7); 而且提示不能转换为int *。而一维数组就可以直接传入数组名字。,
}

FindNum( (int *)array ,4,4,7); //加强制转换试试

因为
bool FindNum(int *arr,int columns,int rows,int nFindNum) //这里定义时,第一个参数是int *,而二维数组的数组名表示的(相当于)是个二维指针变量,所以会报有类型不同的错误。

而一维数组的数组名,表示的就是个一维指针变量,所以,不需要加处理。追问

二维指针变量,我直接传入*array这种形式为什么就能成立,能在详细解释下么,谢谢拉。也是意味着我传入*array,代表传入的是个 int*的变量么

追答

一维数组名,表示数组首地址,通过这个地址,可以找到首元素
二维数组名,也表示数组首地址,但通过这个地址,找到的是首行的地址,这个地址,相当于一个一维数组的首地址。
如果从形式上来理解的话,可以简单这样认为:
int a[10] ; a对应一维指针
int aa[4][5]; aa对应二维指针 (实际上不是,应该是对应 int (*p)[5] ,看不懂的话以后慢慢学到了相应的知识就懂了 )

array若是二维指针,则*array就是一维指针了。 对于二维数组aa[4][5] 数值上来说 aa == &aa == *aa

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-09-13
因为你的m和n是传入的参数
程序没运行的时候是没有值的
所以你这时候x[m][n];这么写 编译器是不知道你到底要分配多少空间的
象你这种情况 需要动态申请二位空间
int **add(int **p,int m,int n)//是 二维数组的名字 2维大小(可能错了....){
int **x=new int*[m];
for(int i=0;i<m;i++){
x[i]=new int[n];
for(int j=0;j<n;j++) x[i][j]=p[m][n]+m+n;}
return x;//返回 x数组}

关于C语言的二维数组作为函数参数的问题?
int (*arr)[m];所以,传递二维数组作为参数,实际上就是传递了一个指针。将形参的类型定义成int*,再在函数内部转换回指向数组的指针就行了,比如:void f(int *p,int row,int column){ int (*arr)[column]=(int (*)[column])p;\/\/使用二维数组arr } 这样传递参数:int n=5,m=6;int a...

二维数组作为函数参数问题?
a数组的首地址是a[0][0]元素的首地址,如果你想传递第一维数地址为参数,可用*(a+N*10)的方式来传递,其中N是你想传递的行数。比如想传递第三行的首元素,可写成*(a+2*10),这样传递的即是a[2][0],像你这样a[9]作为形参貌似不可以。可以用指针的思路来解决。以上是我的想法。可不可行...

二维数组做为参数的问题
因为 bool FindNum(int *arr,int columns,int rows,int nFindNum) \/\/这里定义时,第一个参数是int *,而二维数组的数组名表示的(相当于)是个二维指针变量,所以会报有类型不同的错误。而一维数组的数组名,表示的就是个一维指针变量,所以,不需要加处理。

关于二维数组做为函数的参数和返回的问题
int *add(int *p,int m,int n)\/\/是 二维数组的名字 2维大小(可能错了...){ int *x;int *temp;x=(int *)malloc(sizeof(int)*n*m);for(int i=0;i<m;i++)for(int j=0;j<n;j++)*(x+i*n+j)=*(p+i*n+j)+m+n;return x;\/\/返回 x数组} void main(){ int a[2...

VHDL里 二维数组的赋值问题
先假设你的定义正确,那么你的信号w一定是w(x,y)类型的,那你调用的时候就不能只用一个参数x,(y呢?);其次,你的定义是相互矛盾的,本身就有问题。你想:端口b是一个标准逻辑位矢量的类型,把它赋给一个二维数组w(x,y)类型,本身就违反了同型赋值的规则,是不可能实现的;正确的做法应该...

二维数组指针作为参数,函数返回值也是一个二维数组指针时该如何写?为...
int a=*((int *)A+n*i+k); 》》改成》》 int a=A[i][k]; 即可!因为实参中的B中的元素不是连续存放的,故采用 ((int *)A+n*i+k) 形式访问错误!因为*((int *)A+n*i+k)获得的值是地址,故“运行结果却是很大的数”,你可以调试程序,看变量的值就非常清楚了!另...

二维数组为什么形参用int**a会报错?
int **型的类型的二维指针p. 在做p[i][j]取值的时候, 本质上是*(*(p+i)+j)也就是先到p+i这个地址上取一个值, 把这个值当做地址, 偏移j个单元, 再取值.而二维数组是连续的, 在p+i这个地址上一样存的是值, 不存在这个地址.所以会出错.正确做法:参数为每行N个元素的二维数组时, ...

c语言中如何将二维数组作为函数的参数传递?
在函数定义中,我们可以将二维数组作为参数传递,这可以通过在函数签名中使用指针数组来实现。指针数组是一个包含指针元素的数组,可以像处理其他数组一样使用。例如,`int (*p)[20]`表示一个指向长度为20的整数数组的指针数组。为了将一个二维数组作为函数参数传递,只需将数组名传递给函数。数组名实际上...

二维数组如何作为参数传递?其数组名是什么?求实例:::
1、用数组名传递 也就是用指针传递(数组名指向数组的第一个元素),如:有数组int a[5][5],函数void f(int *a);在main函数调用时直接使用f(a)就可以,但是这种方法只能传递一个指针,数组的大小等信息传递不进去;2、用引用传递 这个时候可以将数组都传递进去(数组名和大小),如:有...

二维数组作为函数参数
假设你定义的函数是int f(int a[]) 你在调用时只要把s[2]作为参数就可以了,即执行语句f(s[2]);,在被调用函数中a[0]就是s[2][0],其他的同理,其实形参a就相当于是指针变量的,

相似回答
大家正在搜