我知道我可以使用 vector 名称作为指针。例如,如果我想使用这种技术查看数组的内容,我可以这样做:
#include <stdio.h>
#define MAX 5
int main(void) {
int *p;
int a[MAX] = {1, 2, 3, 4, 5};
for(p = a; p < a + MAX; p++)
printf("%d -> (%p)\n", *p, p);
printf("\n");
return 0;
}
我想使用相同的技术对二维 vector 做同样的事情(因为 C 中的二维 vector 被处理为一维 vector ),我想我会这样做:
#include <stdio.h>
#define MAX 5
int main(void) {
int *p;
int b[MAX][MAX] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25}
};
for(p = b; p < b + MAX * 2; p++)
printf("%d -> (%p)\n", *p, p);
printf("\n");
return 0;
}
但它不起作用。我可以写:
for(p = &b[0][0]; p <= &b[MAX - 1][MAX - 1]; p++)
printf("%d -> (%p)\n", *p, p);
但我想了解为什么我不能使用用于一维 vector 的语法。
最佳答案
当您使用数组名称时(C 中没有“vector ”),它会“衰减”为指向数组第一个元素的指针。这对于简单的 (1D) 数组来说简单明了,但是当您转向“2D”数组时,事情就变得更加复杂了。首先,术语“二维数组”在 C 中含糊不清——有数组的数组和指针数组,两者都可以像二维数组一样工作,但它们有很大的不同。
在你的例子中,你有一个数组数组,所以你可以这样做:
int b[MAX][MAX] = ...
int (*p1)[MAX];
int *p2;
for (p1 = b; p1 < b + MAX; p1++)
for (p2 = *p1; p2 < *p1 + MAX; p2++)
printf("%d -> (%p)\n", *p2, p2);
在这里,您使用 p1
迭代外部数组(因此 p1
是指向数组的指针),然后使用 p2
遍历每个数组。
如果你真的想把它作为一个循环来做,你可以这样做
int *p;
for (p = *b; p < *(b + MAX); p++)
printf("%d -> (%p)\n", *p, p);
关于c - 使用 vector 名称作为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58637330/