如何设置指向二维数组的指针

时间:2016-12-07 20:30:46

标签: c arrays pointers

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

如果是

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和一元&运算符的操作数。

答案 1 :(得分:0)

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

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; and char **d=&c;)。此示例仅供您明确如何分配内存。