【问题标题】:How can i set a pointer to a 2-D array如何设置指向二维数组的指针
【发布时间】:2016-12-07 20:30:45
【问题描述】:

只是想提前说声谢谢。我知道我可以通过示例设置指向数组的指针:

char myArray[100] = {""};
char *myArrayPtr = myArray;

但我对如何指向多维数组感到困惑。例如。

char myArray[10][100] = {""}; 
char *myArrayPtr = myArray;

我的想法是,除了第二个有点不同之外,它们是相同的。第一个是指向大小为 [100] 的数组的指针,第二个是指向多维数组第一行的指针。这是正确的思维方式吗?如果是这样,我怎样才能使第二个指针指向整个多维数组?

【问题讨论】:

  • char *myArrayPtr = &myArray; 是错误的。检查您的编译器消息,如果您没有看到任何消息,那么您需要配置错误/警告级别。在进入二维数组案例之前,您需要了解此案例。
  • 请不要试图在回复 cmets 时更正问题,除非增加清晰度。
  • C 中,数组只是指针。指向char 的一维数组的指针和指向多维数组的指针之间没有区别。它们都是char* 值。
  • @SunKnight0;在 C 中,指针不是数组,数组也不是指针。
  • 这似乎是一种初始化chars 数组的不寻常方式。通常我们会看到myArray[100] = ""myArray[100] = {'\0'}。 OP 示例中的括号分隔符是否将空字符串文字放在一个块中?

标签: c arrays pointers


【解决方案1】:

如果发生

char myArray[100] = {""};  

char *myArrayPtr = myArray; 有效,因为myArray 衰减1 指向其第一个元素的指针。衰减后的类型为char *

如果发生

char myArray[10][100] = {""}; 

char *myArrayPtr = myArray; 不起作用,因为衰减后myArray 将指向它的第一个元素,衰减后它的类型是char (*)[100]

为了使类型兼容,myArrayPtr 应该是相同的类型。

char (*myArrayPtr)[100] = myArray; 

1 数组到指针的转换在表达式中使用数组时发生,除非它是sizeof 和一元& 运算符的操作数。

【讨论】:

  • 可以使用 typedef 进一步简化事情:typedef char array2d[100];, array2d myArray[10] = {""}; array2d *myArrayPtr = myArray;
  • @yLaguardia;如果是指针和数组,typedef 只是混淆代码。
  • @hacks 谢谢你,这真的很有帮助,现在这可能是题外话,但有没有办法为二维数组指针分配内存空间?
  • @bodotheguy;你的意思是如何动态分配二维数组?
【解决方案2】:

就内存分配而言,二维数组与一维数组没有什么不同。
可能以下代码将清除您的所有困惑:

int a[3][3]={{0,1,2},
             {3,4,5},
             {6,7,8}};
char *c[3][3]={{"00","11","22"},
               {"33","44","55"},
               {"66","77","88"}};
int *b=a;
printf("a[0][0]: %d\ta[0][1]: %d\ta[0][1]: %d\n", *(b+3*0+0), *(b+3*0+1), *(b+3*0+2));
printf("a[1][0]: %d\ta[1][1]: %d\ta[1][1]: %d\n", *(b+3*1+0), *(b+3*1+1), *(b+3*1+2));
printf("a[2][0]: %d\ta[2][1]: %d\ta[2][1]: %d\n", *(b+3*2+0), *(b+3*2+1), *(b+3*2+2));
char **d=&c;
printf("c[0][0]: %s\tc[0][1]: %s\tc[0][1]: %s\n", (*d+9*0+0), (*d+9*0+3), (*d+9*0+6));
printf("c[1][0]: %s\tc[1][1]: %s\tc[1][1]: %s\n", (*d+9*1+0), (*d+9*1+3), (*d+9*1+6));
printf("c[2][0]: %s\tc[2][1]: %s\tc[2][1]: %s\n", (*d+9*2+0), (*d+9*2+3), (*d+9*2+6));

会给出一个输出:

a[0][0]: 0  a[0][1]: 1  a[0][1]: 2
a[1][0]: 3  a[1][1]: 4  a[1][1]: 5
a[2][0]: 6  a[2][1]: 7  a[2][1]: 8
c[0][0]: 00 c[0][1]: 11 c[0][1]: 22
c[1][0]: 33 c[1][1]: 44 c[1][1]: 55
c[2][0]: 66 c[2][1]: 77 c[2][1]: 88

请注意,我使用了(*d+9*1+6) 而不是(*d+3*1+2)。这是因为每个字符串都是 3 个字符长(包括\0)。

另请注意,您将收到赋值语句的警告(int *b=a; andchar **d=&c;)。这个例子只是为了让您清楚地了解内存是如何分配的。

【讨论】:

  • int *b=a; 是一个错误。 char **d=&c; 是一个错误。您的程序输出是未定义的行为。
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2017-06-11
  • 2012-01-26
相关资源
最近更新 更多