我正在尝试将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) { ... };
我在做什么错?谢谢。
答案 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} }指令以访问阵列中的正确内存位置。