指向整数指针的指针数组 VS 指向整数数组指针的指针

问题描述 投票:0回答:1

我有 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)进行编译(带有警告),但在执行时,它可以访问指向数组的第一个元素,但会为下一个元素创建分段错误。

arrays c pointers compound-literals
1个回答
0
投票

要通过类型

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]},
    };
© www.soinside.com 2019 - 2024. All rights reserved.