只想提前说谢谢。我知道我可以通过示例设置指向数组的指针:
char myArray[100] = {""};
char *myArrayPtr = myArray;
但我对如何指向多维数组感到困惑。例如。
char myArray[10][100] = {""};
char *myArrayPtr = myArray;
我的想法是,这些是相同的,除了第二个有点不同。第一个是指向大小为[100]的数组的指针,第二个是指向多维数组第一行的poitner。这是正确的思维方式吗?如果是这样,我如何使第二个指针指向整个多维数组?
答案 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;
)。此示例仅供您明确如何分配内存。