二维数组查找
1.int a; int*a; int **a; int (*a)[10]; int (*a) (int)的区别。
a) int a 表示一个内存空间,这个空间用来存放一个整数。
b) int *a指向一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间。
c) int **a表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。指向了一个b)中提到的空间。
d) int(*a)[10]表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为10,类型为int的数组;与int **a的差别主要体现在a++上。
e) int (*a) (int)表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个int型的参数,并且函数的放回类型也是int。
2.当声明一个数组时,数组的名字也是一个指针。32位系统上,对任意指针求sizeof,得到的结果都是4. 当数组作为函数参数进行传递时,数组自动退化为同类型的指针。
3.例题:二维数组中的查找。
二维数组的每一行是按从左到右递增以及从上到下递增来排序的,判断数组中是否含有一个整数。
解决思想:找到最右边的列的第一个数,如果比要寻找的数大,则该列都不用再考虑,如果比要寻找的数小,则该行都不用再考虑。递归求解。
#include<iostream> using namespace std; int findnumber(const int* array,int number,int &nrows,int &ncols,const int rows,const int cols) //int ** array并不能把整个数组传进去,因为不知道每一行有几个元素 { if(nrows==0||ncols==0) return 0; else if(*(array+(rows-nrows)*cols+ncols-1)==number) return 1; else if(*(array+(rows-nrows)*cols+ncols-1)>number) { ncols-=1; findnumber(array,number,nrows,ncols,rows,cols); } else if(*(array+(rows-nrows)*cols+ncols-1)<number) { nrows-=1; findnumber(array,number,nrows,ncols,rows,cols); } } int main() //main()函数只能返回int,不能返回bool { int array[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; int rows=4; int cols=4; int nrows=rows; int ncols=cols; int number=7; cout<<findnumber(array[0],number,nrows,ncols,rows,cols); }