码迷,mamicode.com
首页 > 编程语言 > 详细

二维数组查找

时间:2015-06-08 19:02:25      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

 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.数组的参数传递(参考http://blog.csdn.net/dijkstar/article/details/7628638)

#include <stdio.h>

//
//    第一种传递方式(指针方式):int (*x)[20]
//        内部可以把x当成一个二维数组使用
//
void Fn1(int (*x)[20])
{
    for (int i=0; i<10; i++)
    {
        for (int j=0; j<20; j++)
        {
            printf("%d ", x[i][j]);
        }
        printf("\n");
    }
    
}

//
//    第二种传递方式(数组方式):int x[][20]
//        注意:形式参数的第一维允许为空
//
void Fn2(int x[][20])
{
    for (int i=0; i<10; i++)
    {
        for (int j=0; j<20; j++)
        {
            printf("%d ", x[i][j]);
        }
        printf("\n");
    }
}



//
//    第三种传递方式(单指针方式):int x[10][20]
//        内部x为当成一个一维数组使用,需要自己转换下标位置
//
void Fn3(int **x)
{
    for (int i=0; i<10; i++)
    {
        for (int j=0; j<20; j++)
        {
            printf("%d ", x[i*20+j]);
        }
        printf("\n");
    }
}


void main()
{
    //定义实参(实参就是实际的准备向函数中传递的实际变量)
    int xx[10][20];

    //给实参附上初值
    for (int i=0; i<10; i++)
    {
        for (int j=0; j<20; j++)
        {
            xx[i][j] = i+j;
        }
    }

    //调用1——直观简单
    Fn1(xx);

    printf("\n");

    //调用2——直观简单
    Fn2(xx);

    printf("\n");
    
    //调用3——需要强制类型转换
    Fn3((int **)xx);

}

 

4.二维数组的初始化

#include <stdio.h>



void main()
{
    //
    //    字符串1数组初始化
    //        欲取得xx1个数(即下面的每周7天),使用:sizeof(xx1)/sizeof(xx1[0]
    //
    char xx1[][10]=
            {
                "MON",    //!!注意不要忘记【逗号】,否则认为"MONTUE"为一个字符串,编译通过,无任何警告
                "TUE",
                "WED",
                "THU",
                "FRI",
                "SAT",
                "SUN",    //<---最后一个【逗号】,可有可无
            };

    //printf("%d\n", sizeof(xx1)/sizeof(xx1[0]));

    //
    //    字符串2指针数组初始化特殊——可以使用下面的方式
    //        注意:维数可以为空
    //
    char *xx2[]=
    {
            "MON",    //!!注意不要忘记【逗号】,否则认为"MONTUE"为一个字符串,编译通过,无任何警告
            "TUE",
            "WED",
            "THU",
            "FRI",
            "SAT",
            "SUN",    //<---最后一个【逗号】,可有可无
    };


    //
    //    其他类型(这里用整型)的二维数组初始化
    //
    int xx3[][3]=
    {
        {11, 22, 33},
        {10, 20, 30},
        {12, 22, 32},
        {15, 25, 35},
    };
    printf("%d\n", sizeof(xx3)/sizeof(xx3[0]));



    //
    //    但其他类型(这里用整型)的指针数组初始化错误!!
    //
    /*
    int *xx4[]=
    {
        {11, 22, 33},
        {10, 20, 30},
        {12, 22, 32},
        {15, 25, 35},
    };
    */

    //
    // 但可以先“分开”定义,再使用分开定义的变量
    //
    int x1[] = {11, 22, 33};
    int x2[] = {15, 22, 33};
    int x3[] = {14, 22, 33};

    int *xx4[]=
    {
        x1, x2, x3,
    };

}

 

5.例题:二维数组中的查找。

二维数组的每一行是按从左到右递增以及从上到下递增来排序的,判断数组中是否含有一个整数。

解决思想:找到最右边的列的第一个数,如果比要寻找的数大,则该列都不用再考虑,如果比要寻找的数小,则该行都不用再考虑。递归求解。

#include<iostream>
using namespace std;

int findnumber(int** const array,int number,int &nrows,int &ncols,const int rows,const int cols)
{
    if(nrows==0||ncols==0)
        return 0;
     else if(array[rows-nrows][ncols-1]==number)
    return 1;
     else if(array[rows-nrows][ncols-1]>number)
    {
        ncols-=1;
            findnumber(array,number,nrows,ncols,rows,cols);
    }
     else if(array[rows-nrows][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}};  
 //error: cannot convert ‘int (*)[4]‘ to ‘int**‘ for argument ‘1‘ to ‘int findnumber(int**, int, int&, int&, int, int)‘

    int rows=4;
    int cols=4;
    int nrows=rows;
    int ncols=cols;
    int number=7;
    return findnumber(array,number,nrows,ncols,rows,cols);
}

 

二维数组查找

标签:

原文地址:http://www.cnblogs.com/wy1290939507/p/4561294.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!