2011-05-31 30 views
2

如何获取多维静态数组的地址? 例如,这是我的数组获取多维静态数组的地址

char array[2][10] = {"word1", "word2"}; 

是否有可能得到的地址,让我参考使用这样的指针数组?我试过&数组或直接指针=(char **)数组;但在启动时崩溃。

+1

'char ** pointer = array'就足够了。如果它崩溃了,你就会在别的地方发现bug。你甚至不需要演员。 – hirschhornsalz 2011-05-31 21:22:43

+0

发布您的代码。 '指针=(char **)数组;'应该已经工作了,如果它崩溃了 - 还有其他一些问题。 – littleadv 2011-05-31 21:23:47

+0

嗯它崩溃了,因为我引用第二个char *(word2)与“指针[0]”...而不是使用“指针”所有字符,直到'\ 0'被打印,因此我看到“word1”。但为什么是非法的? char **指针应该是一个char *数组,因此这个表达式“pointer [0]”不应该是非法的...... – Exor 2011-05-31 21:33:31

回答

5

char **pointer表示指针指向指针。 所以*pointer预计是一个指针(例如,可以解释为地址的4字节值)。

数组并非如此:它是内存中的一个连续区域(20个字节)。

因此,当您尝试将数组转换为char **时,您的应用程序将崩溃。 这是不可能做这种转换,char **必须指向一个指针。

+0

Peter Peter Der Linden对“Expert C Programming”的评价,他解释了我认为我已经知道的很多东西。 – 2011-05-31 21:41:36

+0

Right ...“array”可以被看作是一个简单的char *指针,被编译器视为一个“有界”的矩阵。因此,我会错误地将这个数组赋值给一个指针数组。我应该自己初始化每个指针,这样做?' \t char arr [2] [20] = {“word1”,“word2”}; \t char ** pointer = new char * [2]; \t pointer [0] = arr [0]; \t指针[1] = arr [1];' – Exor 2011-05-31 21:54:49

+0

@Exor:是的,那可行。但它必须“手动”完成,没有自动转换,因为类型不兼容。 – 2011-05-31 22:18:53

2

“array”是数组在内存中的地址,但它不是char **。虽然你可以投它,如果你尝试

printf("%s", pointer[1]); 

,因为你的情况可能是一样的

printf("%s", (char *)(0x00000031)); 

因为指针[1]的意思是”第二个4字节的指针(假定该应用程序会崩溃x86)从'array'开始。 指针[0]可能不会崩溃,但不会出于同样的原因显示“word1”。

你可能想(这是很难remeber,所以我不得不在网上查询,希望这是正确的):

char (*pointer)[10] = array; 

这是一个指向10个字符数组。如果你使用指针[1],它现在意味着“从'数组'开始的第二个10个字符块”。