c - 使用 vector 名称作为指针

标签 c arrays pointers

我知道我可以使用 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/

相关文章:

arrays - 使用 R 将文件导入数组

ios - 如何计算 Swift 数组中某个元素的出现次数?

c++ - 具有调试功能的 C/C++ IDE 的建议

c++ - 如何确保我可以读取该文件并且它没有被另一个进程锁定

java - 将高尔夫分数放入数组中

c - 函数之间的全局指针

c++ - 将空指针隐式转换为 bool

c++ - 为什么我的链表实现不起作用?

c - 为什么在 LinkedList 的这个实现中会出现段错误

c - 查找二维数组的最大大小