从另一个数组内的数组中检索值[C]

时间:2017-01-23 17:51:11

标签: c arrays multidimensional-array int

看看这个数组:

const int *c000[64][1][3] =
{
//Row 1
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },

//Row 2
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },

//Row 3
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },

//Row 4
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },

//Row 5
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },

//Row 6*
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },

//Row 7
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },

//Row 8
{ {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} }, { {0, 0, 0} },
};

忽略数组奇怪的大小和结构,这不重要。我需要能够在这个数组中使用一个数组。例如,我有一个名为h002的数组:

const int h002[18] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0xe0, 0xe0};           //01

我需要能够从c000内部使用h002。如:

{ {h002, 0, 0} },

这个编译很好,但是

myVar = c000[0][0][0];

检索h002的地址。我需要h002中的第一项,而不是地址。我很困惑为什么它甚至会给我h002的地址呢?我想象* h002会检索地址,但那根本就没有编译。

我已经看到了几个与我非常相似的问题,比如这个:

Creating an array of int arrays in C?

我上面尝试过这个特定的例子。它在我的main.c文件中有效,但是当我在包含c000和h002的同一.c文件中尝试它时,它无法编译。也许这与它有关?我不知道为什么会这样,考虑在c000中使用h002返回h002的地址就好了。奇怪的是,上面链接中显示的代码不会在我的主文件之外编译。

我觉得我犯了一些明显的小错误。我现在一直在搞乱这件事,持续约5天。试验和错误以及研究让我无处可去。研究很困难,因为使用这样的数组似乎没什么用,我的研究结果都没有给我带来很大的帮助。

随意提问。如果需要,我很乐意指定更多信息。

编辑:非常感谢Stephan Lechner帮助我解决问题。为了得到我需要的结果,我必须做

myVar = *(c000[0][0][0]);

这完美无缺。我还可以在最后添加我喜欢的任何数字来检索h002中的不同索引。例如:

myVar = *(c000[0][0][0] + 7); 

希望将来可以帮助某人。

2 个答案:

答案 0 :(得分:1)

我认为基本的误解是var match = "abcd|efhi|jklm|nopq|rstu|vwxyz".split('|'); if (match.indexOf($('element').text().toLowerCase()) !== -1) { // match found } 的含义,它表示指向int的三维指针数组,但不是指向整数3D数组的指针。为了证明这一点,请考虑以下简化示例和编译器警告:

const int *c000[64][1][3]

只是为了显示不同的含义:如果想要声明一个指向5个整数数组的指针,可以表示如下:

int aSingleIntValue = 10;  // integer value
int *aSinglePtrToIntValue = &aSingleIntValue;  // pointer to an integer value

// 1D-array of integer values
int oneDArrayOfInt[5] = { 3,4,5,6,7 };

// 1D-array of pointers to int; Note: OK, since 0 is interpreted as NULL
int *oneDArrayOfIntPtrOK[5] = { aSinglePtrToIntValue,0,0,0,0 };

// 1D-array of pointers to int; Note: 3,4,.. are int values, not pointers to int; Hence compiler complains:
// Warning: Incompatible integer to pointer conversion initializing "int *"  with an expression of type "int"
int *oneDArrayOfIntPtrWarning[5] = { 3,4,5,6,7 };

// 3D-array of pointers to int; Note: OK, since 0 is interpreted as NULL
int *threeDArrayOfIntPtrOK[5][5][5] = { { { aSinglePtrToIntValue,0,0 }, { 0,0,0} } };

// 3D-array of pointers to int; Warining: Incompatible integer to pointer conversion initializing "int *"  with an expression of type "int"
int *threeDArrayOfIntPtrWarning[5][5][5] = { { { 3,4,5 }, { 2,3,1} } };

鉴于此,我们来解释一下

的含义
typedef int arrayOf5Int_t[5];
arrayOf5Int_t *arrayOf5IntPtr = &oneDArrayOfInt;

请注意,c000的元素是指向整数的指针,请注意,在数组初始化器的上下文中使用的变量const int h002[18] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0xe0, 0xe0}; const int *c000[64][1][3] = { { { h002, 0, 0 } } }; 衰减为指向整数的指针(指向h002的第一个元素)。这与声明h002几乎相同,以下打印出来表明这实际上是相同的:

const int* ptrToH002 = h002

因此,应该清楚const int *elemAt0x0x0 = c000[0][0][0]; const int *ptrToH002 = h002; int isTheSame = elemAt0x0x0 == ptrToH002; printf("pointer elemAt0x0x0 == ptrToH002 is %s", (isTheSame ? "true" : "false")); // Prints: pointer elemAt0x0x0 == ptrToH002 is true 检索地址,而不是整数值或整数数组。地址指向数组myVar = c000[0][0][0]的第一个元素。

答案 1 :(得分:-2)

多维数组示例:

int main(){
    int a1[] = {1,2,3,4};
    int a2[] = {5,6,7,8};
    int a3[] = {9,10,11,12};
    int * superArr[3] = {a1,a2,a3};
    printf("%d\n", superArr[2][1]);
}

您应该能够使用此示例将代码更改为您需要的内容。