C语言矩阵传递给函数的方法

时间:2024-03-09 07:01:12

C语言矩阵传递给函数的方法

先看一道题:

A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element.

Now given an M x N matrix, return True if and only if the matrix is Toeplitz.

Example 1:

Input:
matrix = [
  [1,2,3,4],
  [5,1,2,3],
  [9,5,1,2]
]
Output: True
Explanation:
In the above grid, the diagonals are:
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]".
In each diagonal all elements are the same, so the answer is True.

Example 2:

Input:
matrix = [
  [1,2],
  [2,2]
]
Output: False
Explanation:
The diagonal "[1, 2]" has different elements.

Note:

  1. matrix will be a 2D array of integers.
  2. matrix will have a number of rows and columns in range [1, 20].
  3. matrix[i][j] will be integers in range [0, 99].
bool isToeplitzMatrix(int** matrix, int matrixRowSize, int *matrixColSizes) {
    for (int i = 0; i < matrixRowSize - 1; ++i)
    {
        for (int j = 0; j < *matrixColSizes - 1; ++j)
        {
//          if (matrix[i][j] != matrix[i + 1][j + 1])
//          if(*((int*)matrix+i**matrixColSizes+j)!=*((int*)matrix+(i+1)**matrixColSizes+j+1)) /*不通过*/
            if(*(*(matrix+i)+j)!=*(*(matrix+(i+1))+j+1))
            {
                return false;
            }
        }
    }

    return true;
}

这是一个能够通过的答案,由于C语言中矩阵一般是线性排列的,所以一开始用*((int*)matrix+i**matrixColSizes+j)表示matrix[i][j],但是总是不通过。查看答案,发现直接用matrix[i][j]居然直接通过,所以leetcode后台可能不是把矩阵线性排列的,于是试着用*(*(matrix+i)+j)表示matrix[i][j],居然成功了。根据这个,matrix应该是指向一个指针数组,数组里的每个元素又指向每一行元素组成的数组。

一般地,我们在传递一个矩阵给函数时,根据原数组的存储方式一般有两种传递方式。

第一种是矩阵是线性存储的,即矩阵就是一块m×n的连续内存地址,此时一般函数地形参设为int (*matrix)[matrixColSizes](matrixColSizes),是一个常数)这表示matrix指向一个数组,该数组每个元素是一个含有matrixColSizes个int类型元素的数组,此时matrix[i][j]解释为*((int*)matrix+i*matrixColSizes+j)

第二种是矩阵不是线性存储的,即矩阵是一个指针数组,数组中的每一个元素是一个指针,改指针指向一个由矩阵一列元素组成的数组,此时matrix[i][j]解释为*(*(matrix+i)+j