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:
matrix
will be a 2D array of integers.matrix
will have a number of rows and columns in range[1, 20]
.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应该是指向一个指针数组,数组里的每个元素又指向每一行元素组成的数组。
一般地,我们在传递一个矩阵给函数时,根据原数组的存储方式一般有两种传递方式。
第一种是矩阵是线性存储的,即矩阵就是一块的连续内存地址,此时一般函数地形参设为int (*matrix)[matrixColSizes]
(matrixColSizes
),是一个常数)这表示matrix指向一个数组,该数组每个元素是一个含有matrixColSizes
个int类型元素的数组,此时matrix[i][j]
解释为*((int*)matrix+i*matrixColSizes+j)
。
第二种是矩阵不是线性存储的,即矩阵是一个指针数组,数组中的每一个元素是一个指针,改指针指向一个由矩阵一列元素组成的数组,此时matrix[i][j]
解释为*(*(matrix+i)+j
。