gpt4 book ai didi

c - 指向未知大小的现有二维数组的指针?

转载 作者:太空狗 更新时间:2023-10-29 16:06:07 29 4
gpt4 key购买 nike

我有以下内容:

struct matrix {
int h;
int w;
int** data;
};

int m1[2][2] = {
{1, 2},
{3, 4}
};

int m2[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

struct matrix matrix1 = {2, 2, m1};
struct matrix matrix2 = {3, 3, m2};

这给出了错误“从不兼容的指针类型初始化”。我应该使用哪种指针类型?

最佳答案

您可能对 C99 的变长数组感兴趣。该解决方案不会直接回答您关于如何使用正确类型的 data 初始化结构的问题(一个不能);但是您可以使用一个简单的指针来存储数组的地址,然后在使用 struct matrix 时转换为可变长度数组指针。

用户端只需调用类似printFroMat() 的函数,它接收一个类型为struct matrix 的参数;如所演示的,这些函数内部的代码(可以说是库实现)将执行有些难看的转换。 typedef 使强制转换可能更容易理解一些,因为它演示了声明中变量名的位置。

请注意,有趣的 sizeof(m2)/sizeof(*m2) 等并不是绝对必要的,您可以只说 3。但是 sizeof 表达式会自动与实际矩阵大小保持同步,这很快就会成为真正的 Assets 。

您可以将“数组”(实际上:仍然只是地址,但属于已知数组类型)连同它们的维度作为参数传递给函数,并以正常方式对它们进行索引(在下面的 printMatrix 中) ).示例:

#include<stdio.h>
#include<string.h>


struct matrix {
int h;
int w;
int *data; // first element of matrix
};

int m2[4][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}
};

void printMatrix(int dim1, int dim2, int mat[][dim2] )
{
printf("Address of matrix: %p\n", (void *)mat);

for(int i1=0; i1<dim1; i1++)
{
for(int i2=0; i2<dim2; i2++)
{
printf("%d ", mat[i1][i2]);
}
putchar('\n');
}
}

void printFromMat(struct matrix mat)
{
printMatrix(mat.h, mat.w, (int (*)[mat.w])mat.data);

// or:
typedef int (*mT)[mat.w];
printMatrix(mat.h, mat.w, (mT)mat.data);
}

int main()
{

printMatrix( sizeof(m2) /sizeof(*m2), // number of highest-order elements
sizeof(*m2)/sizeof(**m2), // number of second-order elements per highest-order
m2 ); // address of the first sub-array

struct matrix mat = { sizeof(m2) /sizeof(*m2), sizeof(*m2)/sizeof(**m2), *m2 };

printFromMat(mat);


return 0;
}

示例 session :

$ gcc -std=c99 -Wall -o 2d-matrix 2d-matrix.c && ./2d-matrix
Address of matrix: 0x100402020
1 2 3
4 5 6
7 8 9
10 11 12
Address of matrix: 0x100402020
1 2 3
4 5 6
7 8 9
10 11 12
Address of matrix: 0x100402020
1 2 3
4 5 6
7 8 9
10 11 12

关于c - 指向未知大小的现有二维数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36034783/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com