我在 C 中遇到了一些“奇怪”的行为,至少是我没有预料到的。考虑以下代码行:
int arrayB[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
printf("%d\n", (arrayB+1)[1]);
这很好用,因为 (arrayB + 1)[1]
转换为 *(arrayB+1 +1)
这是 arrayB< 的第三个元素
(因此它按预期打印 3)
但是,考虑下面的代码,我在其中初始化了一个名为 arrayA
的二维数组(有 5 个数组,每组 10 个整数,每个 {0, 1, 2, 3, 4, 5, 6 , 7, 8, 9}
)
int ** arrayA = malloc(sizeof(int *) * 5);
for (int i = 0; i < 5; i++) {
arrayA[i] = malloc(sizeof(int) * 10);
for (int j = 0; j < 10; j++) {
arrayA[i][j] = j;
}
}
printf("%d\n", *(arrayA+1)[2]);
此代码不会引发警告,它声称 *(arrayA+1)[2]
是一个 int 类型。然而..它似乎应该是(因为数组下标比取消引用运算符具有更高的优先级),*(arrayA+1)[2]
转换为 *(arrayA+3)
是 int *
类型,因为 arrayA
是 int **
更进一步的是,这是允许的:
*(arrayA+1)[2] = 1;
但这怎么可能呢?好像我正在将 int
分配给 int *
... 这通常会引发警告。
最佳答案
it seems that ...
*(arrayA+1)[2]
translates to*(arrayA+3)
不,你丢了一个*
。 *(arrayA+1)[2]
翻译成**(arrayA+3)
,确实是一个int
。
关于数组中的矛盾指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36588166/