Dereferenceof(指针指向指针数组指向指针数组指向整数数组)以获取末尾的整数

r3i60tvu  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(158)

我想声明指针ptr0,它指向具有指针元素的array1 of pointers to arrays of pointers,而array1 of pointers to arrays of pointers指向另一个由整数元素组成的arrays of pointers to arrays of integers
注意:每个数组由三个元素组成。
以下是我方法:

//C99

#include <stdio.h>
#include <stdlib.h>
int main()
{


/* Level 3 */
int arrays_int_3_1_1[3] = {0,1,2};
int arrays_int_3_1_2[3] = {3,4,5};
int arrays_int_3_1_3[3] = {6,7,8};
    
int arrays_int_3_2_1[3] = {9,10,11};
int arrays_int_3_2_2[3] = {12,13,14};
int arrays_int_3_2_3[3] = {15,16,17};

int arrays_int_3_3_1[3] = {18,19,20};
int arrays_int_3_3_2[3] = {21,22,23};
int arrays_int_3_3_3[3] = {24,25,26};

/* Level 2 */
void *arrays_2_1[3] = {(void*)arrays_int_3_1_1,(void*)arrays_int_3_1_2,(void*)arrays_int_3_1_3};
void *arrays_2_2[3] = {(void*)arrays_int_3_2_1,(void*)arrays_int_3_2_2,(void*)arrays_int_3_2_3};
void *arrays_2_3[3] = {(void*)arrays_int_3_3_1,(void*)arrays_int_3_3_2,(void*)arrays_int_3_3_3}; 

/* Level 1*/
void **array1[3] = {arrays_2_1,arrays_2_2,arrays_2_3};

/* Level 0*/
void ***ptr0 = array1;

/*-----------------------------*/

for (int i = 0 ; i <27 ; i++)
{
    // Question here..
    printf("%d \n", <??? How to do the dereference to access each element ???>);
}

}

问题是〉〉如何解引用以访问每个元素

okxuctiv

okxuctiv1#

ptr0指向array1的第一个元素(array1[0]),因此ptr0可以用作array1的别名。
array1的每个元素都指向其中一个arrays_2_*的第一个元素,因此可以用作这些元素的别名。
每个arrays_2_*的每个元素都是指向其中一个arrays_3_*(强制转换为void *类型)的第一个元素的指针。强制转换回int *类型将生成对应arrays_int_3_*的别名。
执行解引用的方法不止一种,但您可能会沿着以下路线寻找一些方法:

int j = ((int *)ptr0[l][m])[n];
    //              \__a__/
    //              \___b____/
    //      \____________c____/
    //      \_____________d______/

    //  a: one element of array1 (a void **)
    //  b: one element of one of the arrays_2_* (a void *)
    //  c: (b), converted to type int *; this points into one of the arrays_int_3_*
    //  d: one element of one of the arrays_int_3_*

如何将一个整数i(范围为0 ... 26)转换为三个整数lmn(范围均为0 ... 2),这是一个练习题。

hujrc8aj

hujrc8aj2#

不知道你为什么要把它们转换成void*,但是我把它们转换回来打印。

#include <stdio.h>
#include <stdlib.h>
int main()
{


/* Level 3 */
int arrays_int_3_1_1[3] = {0,1,2};
int arrays_int_3_1_2[3] = {3,4,5};
int arrays_int_3_1_3[3] = {6,7,8};
    
int arrays_int_3_2_1[3] = {9,10,11};
int arrays_int_3_2_2[3] = {12,13,14};
int arrays_int_3_2_3[3] = {15,16,17};

int arrays_int_3_3_1[3] = {18,19,20};
int arrays_int_3_3_2[3] = {21,22,23};
int arrays_int_3_3_3[3] = {24,25,26};

/* Level 2 */
void *arrays_2_1[3] = {(void*)arrays_int_3_1_1,(void*)arrays_int_3_1_2,(void*)arrays_int_3_1_3};
void *arrays_2_2[3] = {(void*)arrays_int_3_2_1,(void*)arrays_int_3_2_2,(void*)arrays_int_3_2_3};
void *arrays_2_3[3] = {(void*)arrays_int_3_3_1,(void*)arrays_int_3_3_2,(void*)arrays_int_3_3_3}; 

/* Level 1*/
void **array1[3] = {arrays_2_1,arrays_2_2,arrays_2_3};

/* Level 0*/
void ***ptr0 = array1;

/*-----------------------------*/

for (int i = 0 ; i < 27 ; i++)
{
    printf("%d \n", ((int*)(ptr0[i/9])[(i/3)%3])[i%3]);
}

}

相关问题