2010-05-04 59 views
4

我使用这对于一个特定的功能,包括像这样的变量库:数组指针的数组?

extern const u8 foo[]; 
extern const u8 bar[]; 

我不允许以任何方式重命名这些变量。

但是,我喜欢能够通过数组(或其他类似的方法)访问这些变量,因此我不需要将这些变量的新实例持续硬编码到我的主代码中。

我在创建一个数组的第一次尝试如下:

const u8* pl[] = { 
    &foo, 
    &bar 
}; 

这给我的错误cannot convert 'const u8 (*)[]' to 'const u8*' in initialization,并与帮助其他地方以及一些谷歌搜索,我改变了我的数组这样的:

u8 (*pl)[] = { 
    &foo, 
    &bar 
}; 

编译后,我现在得到错误scalar object 'pl' requires one element in initializer

有没有人有什么想法我做错了?谢谢。

+0

不要考虑数组的地址 - 只要在初始化器中使用数组变量,它们就会衰变成指针。 – 2010-05-04 09:09:09

+0

你想访问_variables_或他们代表的数组吗?这是一个微妙的差异,造成巨大的差异(cfr尼尔巴特沃思的答案) – xtofl 2010-05-04 09:35:09

+0

两者都可能会罚款。那么,如实,我不确定。 – unrelativity 2010-05-04 11:15:03

回答

7

指针数组到数组只有工作,如果foobar具有完全相同的大小和大小是在编译时在你的翻译单元闻名。如果不是这种情况,则必须使用指向字节的指针数组。

const u8 *pl[] = {foo, bar}; 
+1

你可以在数组中指向不完整的类型(比如未知大小的数组),你不能拥有不完整类型的数组。 – 2010-05-04 09:28:38

+0

@Charles你将如何以一种有意义的方式使用它,而不会发生'具有未指定边界错误的数组的无效使用? – fredoverflow 2010-05-04 09:34:32

+0

@FredOverflow:我不确定你的意思?与直接使用'foo'或'bar'的方法相同,它们也是未指定边界的数组。像仍然可以做'foo [x]',所以只要'x'实际上在范围内,你就可以做'(* pl [0])[x]'。你不能检查它,但如果它是有效的,它会工作。 – 2010-05-04 09:52:07

2

由于数组在声明中没有大小,有没有什么理由不能只是指向它们第一个元素的指针数组?

E.g.

const u8* pl[] = { foo, bar }; 

如果你想指针数组数组我认为你需要做的:

const u8 (*pl[])[] = { &foo, &bar }; 

,但我不认为它真的有比以前的解决方案的任何优势。

+0

一个原因?那么,那会是我缺乏知识。我会给你的解决方案尝试一下,看看它是怎么回事...... – unrelativity 2010-05-04 09:18:32

1
extern const int a[]; 

const int * aa[] = { a }; 
1

删除&。数组通常会衰减为指针。

typedef int u8; // Using int as I don't know what a u8 is. 

const u8 foo[] = { 1, 2, 3}; 
const u8 bar[] = { 1 }; 

const u8* pl[] = { 
    foo, 
    bar 
};