我有 3 个整数
A
、B
和 C
,我从中创建指针,将它们分组到指向指针的指针数组 arrayABC
中:
int A = 1;
int B = 2;
int C = 3;
int *ptA = &A;
int *ptB = &B;
int *ptC = &C;
int **arrayABC[] = { &ptA, &ptB, &ptC };
同时我有整数数组
DEF
:
int DEF[] = {4,5,6};
我想将它包装在一个指针数组
arrayDEF
中,这些指针提供与数组arrayABC
相同的接口。我尝试了以下方法:
int **arrayDEF[] = &(int *){&DEF};
我的最终目标是能够将
arrayABC
和 arrayDEF
分组到父数组 arrayGlobal
中,如下所示:
int ***arrayGlobal[] = {arrayABC,arrayDEF};
我需要能够像这样访问
arrayGlobal
:
printf("A = %d\n", **arrayGlobal[0][0]); // A = 1
printf("B = %d\n", **arrayGlobal[0][1]); // B = 2
printf("C = %d\n", **arrayGlobal[0][2]); // C = 3
printf("D = %d\n", **arrayGlobal[1][0]); // D = 4
printf("E = %d\n", **arrayGlobal[1][1]); // E = 5
printf("F = %d\n", **arrayGlobal[1][2]); // F = 6
我能够编译,没有任何错误。然而,执行会导致分段错误。我怀疑
arrayDEF
(指向整数数组的指针的指针)的类型类似于 arrayABC
(指向整数指针的指针数组)的类型,但不等效。你确认吗?
编辑:更多上下文
我正在开发一个程序,该程序将集成到一个更大的程序中。我获得了一个包含大量指针列表的接口文件。我无法更改此列表,也不能保证指针指向的地址在执行过程中不会更改。然后我必须绝对按照指示工作。
因为我需要迭代所有这些指针,所以我将它们分组在一个数组中。 我还需要一个并行表来存储结果。满足我的需要的最佳结构是像我的示例中的
arrayGlobal
这样的结构。通过这样做,我可以使用第一个索引在接口表(0)和结果表(1)之间切换。第二个索引允许我迭代指针。
我可以使用与数组相同的结构轻松地形成结果表
arrayABC
,通过执行类似的操作:
int *ptD = &DEF[0];
int *ptE = &DEF[1];
int *ptF = &DEF[2];
int **arrayDEF[] = { &ptD, &ptE, &ptF };
这肯定会起作用,但是,如果这对于具有 3 个指针的示例来说相当不错,那么对于数百个指针来说,它会非常繁重。
**arrayABC[]
的初始化已经非常繁重(但由界面强加),我想避免对结果表做同样的事情,并尝试寻找更多的一行指令。
我错误地认为,指向整数数组的指针可能等同于指向整数的指针数组,因为数组总是以其第一个元素引用。因此,定义一个包含指向数组所有元素的指针的数组,如下所示:
int array={1,2,3};
*ptarray[] = {&array[0], &array[1], & array[2]};
也可以这样实现:
*ptarray[] = (int *[]){&array};
编译器(gcc)进行编译(带有警告),但在执行时,它可以访问指向数组的第一个元素,但会为下一个元素创建分段错误。
要通过类型
int DEF[] = {4,5,6};
访问 int **[3]
,您需要在某处存储指向这 3 个值中每一个的指针。 例如在指针数组中ptDEF
(命名约定不一致):
#include <stdio.h>
int main() {
int A = 1;
int B = 2;
int C = 3;
int *ptA = &A;
int *ptB = &B;
int *ptC = &C;
int **arrayABC[] = {&ptA, &ptB, &ptC};
int DEF[] = {4,5,6};
int *ptDEF[] = {&DEF[0], &DEF[1], &DEF[2]};
int **arrayDEF[] = {&ptDEF[0],&ptDEF[1],&ptDEF[2]};
int ***arrayGlobal[] = {arrayABC,arrayDEF};
printf("A = %d\n", **arrayGlobal[0][0]); // A = 1
printf("B = %d\n", **arrayGlobal[0][1]); // B = 2
printf("C = %d\n", **arrayGlobal[0][2]); // C = 3
printf("D = %d\n", **arrayGlobal[1][0]); // D = 4
printf("E = %d\n", **arrayGlobal[1][1]); // E = 5
printf("F = %d\n", **arrayGlobal[1][2]); // F = 6
}
arrayGlobal
的声明与您在打印语句中访问变量的方式不匹配,因此我认为***
是**
的拼写错误。 上面将输出:
A = 1
B = 2
C = 3
D = 4
E = 5
F = 6
这可能与您的情况无关,但您可以使用以下方法初始化这些指针:
int **arrayDEF[] = {
&(int *) {&DEF[0]},
&(int *) {&DEF[1]},
&(int *) {&DEF[2]},
};