题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

分析:

1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

从二维数组最右上角的数值(9)开始比较,若目标比该数大,则目标肯定在该数的下方,反之,在该数的左方。根据此规则,寻找下一个比较的数值,重复以上规则,直到找到目标数,或者数组越界。

//
//  main.c
//  func
//
//  Created by 52coder on 2017/12/18.
//  Copyright © 2017年 52coder. All rights reserved.
//
#include <stdio.h>

int Find(int matrix[],int rows,int columns,int number)
{
    if((NULL != matrix )&&(rows > 0)&&(columns > 0))
    {
        int row = 0;
        int col = columns - 1;
        while((row < rows)&&(col >= 0))
        {
            if(matrix[row * columns + col] == number)
            {
                return 1;
            }
            else if(matrix[row * columns + col] > number)
            {
                col = col - 1;
            }
            else
            {
                row = row + 1;
            }
        }
    }
    return 0;
    
}

int search(int (*matrix)[4],int rows,int columns,int number)
{
    if((NULL != matrix )&&(rows > 0)&&(columns > 0))
    {
        int row = 0;
        int col = columns - 1;
        while((row < rows)&&(col >= 0))
        {
            if(matrix[row][col] == number)
            {
                return 1;
            }
            else if(matrix[row][col] > number)
            {
                col = col - 1;
            }
            else
            {
                row = row + 1;
            }
        }
    }
    return 0;
    
}

int main(int argc, const char * argv[])
{
    int a[16]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
    printf("%d\n",Find(a, 4, 4, 7));
    
    int b[4][4]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
    printf("%d\n",search(b, 4, 4, 7));
    return 0;
}

上面的代码中提供了两种解决问题的方法,第一种是按照一维数组的形式所写,书中给出的答案如此,那么如何用二维数组的形式传参呢?
最近刚好在看《C语言程序设计》大名鼎鼎的K&&R,其中有如下介绍,可以参考文章C语言拾遗阅读全部读书笔记。
daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
}
如果将二维数组作为参数传递给函数,那么函数的参数声明中必须指明数组的列数。数组的行数没有太大关系,函数调用时传递的是一个指针,它指向由行向量构成的一维数组,其中每个行向量是具有13个整型元素的一维数组,
在该例子中,传递给函数的是一个指向很多对象的指针,其中每个对象是由13个整型元素构成的一维数组。因此,如果将数组daytab作为参数传递给函数f,那么f的声明应该写成如下形式:
f(int daytab[2][13]){……}
也可以写成
f(int daytab[][13]){……}
由于数组的行数无关紧要,所以该声明还可以写成:

f(int (*daytab)[13]){……}

这种声明形式表明参数是一个指针,它指向具有13个整型元素的一维数组。因为方括号[]的优先级高于*的优先级,所以上述声明中必须使用圆括号,如果去掉圆括号

int *daytab[13]

则变成声明一个数组,该数组有13个元素,其中每个元素都是一个指向整型对象的指针。一般来说,除数组的第一维可以不指定大小外,其余各维必须明确指定大小。