二维数组中的查找问题--剑指offer面试题3

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

// 二维数组中的查找
#include <iostream>
using namespace std;
int SearchMatrix(int *arr, int key, int row, int col)
{
    if (arr == NULL)
        return 0;
    int row_index,col_index,pivotkey;

    int y = sizeof(arr)/sizeof(int);   // for test
    cout << y <<endl;    //   y = 1

    row_index = 0;
    col_index = col - 1;

    while (row_index <= row - 1 && col_index >= 0)
    {
        pivotkey = *(arr + row_index * col + col_index);
        if (pivotkey == key)
            return 1;
        else if (pivotkey > key)
        {
            col_index --;
        }
        else
        {
            row_index ++;
        }
    }
    return 0;
}
int main()
{
    int res, row = 0, col = 0;
    int arr[4][4] = {{1, 2, 8, 9},{2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
    int y = sizeof(arr)/sizeof(int);
    cout << y << endl;       // 输出为16
    row = (sizeof(arr)/sizeof(int)) / (sizeof(arr[0]) / sizeof(int));
    col = sizeof(arr[0])/sizeof(int);
    res = SearchMatrix((int *)arr, 120, row, col);
    if (res == 1)
        cout << "found it" <<endl;
    else
        cout << "not found it" <<endl;
    return 0;
}

在写的时候发现一个问题,就是二维数组作为参数传入函数时,会有多种方法

第一种方式是直接传递二维数组,但是必须标明第二维的值,因为如果只是传递a[][],编译器无法分配这样的数组,所以要这样传int a[][4]

第二种方法是传递指针数组方式,即int (*a)[4]  , 这句话声明了一个指针变量(即数组指针),这个指针指向由4个int组成的数组 ,是一个一级指针
第三种是传递指针方法,即上边程序的方法。

不管是哪一种方法,在写程序的实参时,都要注意要匹配,有时候要进行一些强制类型的转换。

比如:

int a[3][4];

可以理解为a数组是三个元素组成的一维数组,这三个数组的名字分别为a[0], a[1], a[2],其中的每个元素又是由四个元素组成的一维数组。

a是三个一维数组a[0], a[1], a[2]的首地址

而a[0], a[1], a[2]又是三个数组名,分别表示三个一维数组的首地址。

原文地址:https://www.cnblogs.com/simplepaul/p/6882617.html