将2D数组指针传递给C

时间:2018-10-24 03:18:32

标签: c arrays pointers

我正在尝试将2D数组的地址传递给C中的函数。我将2D数组初始化为:

const int N = 3;
char t[N][N];

我尝试将其转换为char ***:

char*** t_ptr = &t;

但是它失败并显示:

warning: initialization from incompatible pointer type

我要接收数组的函数有一个原型,例如:

void f(char*** t, int N) { ... };

我在做什么错?谢谢。

3 个答案:

答案 0 :(得分:1)

char*** t_ptr = &t;
编译器指出,

是错误的,因为t是一个二维数组,而不是像char***这样的三重指针使用指向数组的指针指向它。对于例如

char t[3][3] = { "ab","de","gh"}; /* total 3 1D array & each 1D array has 3 elements */
char (*t_ptr)[3] = t; /* t_ptr is a pointer to an array, pointing to 3 elements at a time */

您可以像打印t_ptr

for(int index = 0; index < 3 ; index++) {
        printf("%s\n",t_ptr[index]);
}

答案 1 :(得分:0)

要阅读c声明,可以访问:this benckmark (2015)

现在使用@Achal的示例数组:


Option Explicit
Public Sub Test()
    Dim inputValue As String, outputValue As String, arr() As String, i As Long, dict As Object
    inputValue = "1,45,2,4,5,2,3,5"
    arr = Split(inputValue, ",")
    Set dict = CreateObject("Scripting.Dictionary")
    For i = LBound(arr) To UBound(arr)
        dict(arr(i)) = vbNullString
    Next
    outputValue = Join(dict.keys, ",")
    Debug.Print outputValue
End Sub

输出:

t is composed of 3 arrays of 3 characters each,
with the following addresses (on my machine):
--------------------------------------------------
000000000022FE2F, 000000000022FE32, 000000000022FE35

Print strings using p:
------------------------
ab, de, gh

Using q:
-----------
ab, de, gh

Individually:
---------------
a b
d e

Using r:
---------------
000000000022FE2F, 000000000022FE32, 000000000022FE35
a, h
Process returned 0 (0x0)   execution time : -0.000 s
Press any key to continue.

答案 2 :(得分:-2)

char t[N][N];

实际上与

相同
char t[N * N];

在内存中。在两种情况下,指向此类数组的指针的类型均为char *

char ***是指向指针的指针,它是指向char的指针,而char *是指向char的指针,这就是在C中传递数组引用的方式:将它们作为a传递指向该数组第一个元素的指针,并且第一个元素是char。

将数组传递给函数后,

C不能保留其确切类型或结构。在内存中,char数组只是一堆充满char的内存,您可以传递的只是指向该内存的指针。如果该内存是char []char [][]或什至char [][][]不起作用,则在内存中所有这三个都是充满字符的块,并且该函数将必须明确知道内存中的结构,否则函数的所有char数组将始终为char []

我强烈建议C初学者不要使用多维数组。代替

char t[N][N];
char c = t[y1][x1];
t[y2][x2] = 'X';

使用

char t[N];
char c = t[y1 * N + x1];
t[y2 * N + x2] = 'X';

因为这基本上就是编译器将在内部执行的操作。

请注意,C语言中的多维数组不是x-y,而是y-x,第一个值是行,第二个值是列,请see this tutorial

谁不相信我刚刚说的话,请尝试以下代码:

int main ( ) {
    char a[5][5];
    for (int y = 0; y < 5; y++) {
        for (int x = 0; x < 5; x++) {
            a[y][x] = x + 10 * y;
        }
    }

    for (int y = 0; y < 5; y++) {
        for (int x = 0; x < 5; x++) {
            printf("%02d ", a[y][x]);
        }
        printf("\n");
    }

    printf("------\n");

    char * a2 = (char *)a;
    for (int y = 0; y < 5; y++) {
        for (int x = 0; x < 5; x++) {
            printf("%02d ", a2[y * 5 + x]);
        }
        printf("\n");
    }
}

如果愿意,您可以run it online,输出是相同的。还可以查看编译器为任一循环生成的汇编代码(例如gcc -S),您会发现它几乎是相同的,即使在第一种情况下,编译器使用add和{{1} }指令以访问阵列中的正确内存位置。