2 个暗淡阵列和双指针

2 dim array and double pointer

本文关键字:指针 阵列      更新时间:2023-10-16

可能的重复项:
创建指向二维数组的指针

当我调用函数 func4(( 和 func5(( 时,我收到以下错误:

func4(( 错误:无法将 'short int (*([3]' 转换为 'short int**' 参数 '1' 到 'int func4(short int**('|func5(( 错误:无法 将参数 '1' 的 'short int (*([3]' 转换为 'short int**' 到 'int func5(short int**('|

如何更正调用函数 func4(( 和 func5(( 时的错误?这是我的代码:

#include <cstdio>
int func1(short mat[][3]);
int func2(short (*mat)[3]);
int func3(short *mat);
int func4(short **mat);
int func5(short *mat[3]);
int main()
{
short mat[3][3],i,j;
for(i = 0 ; i < 3 ; i++)
    for(j = 0 ; j < 3 ; j++)
    {
        mat[i][j] = i*10 + j;
    }
printf(" Initialized data to: ");
for(i = 0 ; i < 3 ; i++)
{
    printf("n");
    for(j = 0 ; j < 3 ; j++)
    {
        printf("%5.2d", mat[i][j]);
    }
}
printf("n");
func1(mat);
func2(mat);
func3(&mat[0][0]);
func4(mat); //error: cannot convert ‘short int (*)[3]’ to 
            //‘short int**’ for argument ‘1’ to       ‘int func4(short int**)’|
func5(mat); //error: cannot convert ‘short int (*)[3]’ to 
            //‘short int**’ for argument ‘1’ to ‘int func5(short int**)’|
return 0;
}

/*
Method #1 (No tricks, just an array with empty first dimension)
===============================================================
You don't have to specify the first dimension!
*/
int func1(short mat[][3])
{
register short i, j;
printf(" Declare as matrix, explicitly specify second dimension: ");
for(i = 0 ; i < 3 ; i++)
{
    printf("n");
    for(j = 0 ; j < 3 ; j++)
    {
        printf("%5.2d", mat[i][j]);
    }
}
printf("n");
return 0;
}
/*
Method #2 (pointer to array, second dimension is explicitly specified)
======================================================================
*/
int func2(short (*mat)[3])
{
register short i, j;
printf(" Declare as pointer to column, explicitly specify 2nd dim: ");
for(i = 0 ; i < 3 ; i++)
{
    printf("n");
    for(j = 0 ; j < 3 ; j++)
    {
        printf("%5.2d", mat[i][j]);
    }
}
printf("n");
return 0;
}
/*
Method #3 (Using a single pointer, the array is "flattened")
============================================================
With this method you can create general-purpose routines.
The dimensions doesn't appear in any declaration, so you
can add them to the formal argument list.
The manual array indexing will probably slow down execution.
*/
int func3(short *mat)
{
register short i, j;
printf(" Declare as single-pointer, manual offset computation: ");
for(i = 0 ; i < 3 ; i++)
{
    printf("n");
    for(j = 0 ; j < 3 ; j++)
    {
        printf("%5.2d", *(mat + 3*i + j));
    }
}
printf("n");
return 0;
}
/*
Method #4 (double pointer, using an auxiliary array of pointers)
================================================================
With this method you can create general-purpose routines,
if you allocate "index" at run-time.
Add the dimensions to the formal argument list.
*/
int func4(short **mat)
{
short    i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
    index[i] = (short *)mat + 3*i;
printf(" Declare as double-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
    printf("n");
    for(j = 0 ; j < 3 ; j++)
    {
        printf("%5.2d", index[i][j]);
    }
}
printf("n");
return 0;
}
/*
Method #5 (single pointer, using an auxiliary array of pointers)
================================================================
*/
int func5(short *mat[3])
{
short i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
    index[i] = (short *)mat + 3*i;
printf(" Declare as single-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
    printf("n");
    for(j = 0 ; j < 3 ; j++)
    {
        printf("%5.2d", index[i][j]);
    }
}
printf("n");
return 0;
}

can't发送二维数组来运行,而无需指定数组的length or size of second dimension。这就是导致错误的原因。

试试这个:

int func4(short mat[][3])
{
short    i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
index[i] = (short *)mat + 3*i;
printf(" Declare as double-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
printf("n");
for(j = 0 ; j < 3 ; j++)
{
    printf("%5.2d", index[i][j]);
}
}
printf("n");
return 0;
}

int func5(short mat[][3])
{
short i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
index[i] = (short *)mat + 3*i;
printf(" Declare as single-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
printf("n");
for(j = 0 ; j < 3 ; j++)
{
    printf("%5.2d", index[i][j]);
}
}
printf("n");
return 0;

}

Remember这一点,如果可以通过一种方式轻松干净地完成某些事情,请不要尝试通过肮脏和困难的方式完成,因为将来修改或更新代码时会让自己感到困惑。

1.它们是相同的:

int func(short **mat);
int func(short *mat[]);
int func(short *mat[3]);

short **short (*)[3]不兼容,因为它们所指向的类型是不同的。 short **指向short *,而short (*)[3]指向short[3]

2.也许你可以试试这个:

int funcMy(void *mat)   // OK! -added by Justme0 2012/12/31
{
    short i, j, *index[3];
    for (i = 0 ; i < 3 ; i++)
        index[i] = (short *)mat + 3*i;
    printf(" Declare as (void *) pointer, use auxiliary pointer array: ");
    for(i = 0 ; i < 3 ; i++)
    {
        printf("n");
        for(j = 0 ; j < 3 ; j++)
        {
            printf("%5.2d", index[i][j]);
        }
    }
    printf("n");
    return 0;
}

3.我认为第三个功能是最好的!它使用了我在 C 上的指针中读到的名为"扁平化数组"的技巧。

方法 #3(使用单个指针,数组被"扁平化"( ==========================================================================================================================================================================================================================尺寸没有 出现在任何声明中,因此您可以将它们添加到正式参数中 列表。

手动数组索引可能会减慢执行速度。

问题在于 func4()func5() 矩阵的定义不正确。

你把它定义为short mat[3][3],但在这种情况下,你实际上并没有为矩阵行分配一个指针数组。您将获得一个连续内存块的指针。

如果你想传递参数矩阵作为short int**,你应该定义如下:

#include <stdlib.h>
short int** mat;
for(int i = 0; i < 3; i++) {
    mat[i] = (short int*)malloc (3*sizeof(short int));
    for(int j = 0; j < 3; i++) {
         mat[i][j] = i*10 + j;
    }
}