Используйте имя вектора в качестве указателя - PullRequest
3 голосов
/ 31 октября 2019

Я знаю, что могу использовать имя вектора в качестве указателя. Например, если я хочу увидеть содержимое массива, используя эту технику, я могу сделать это следующим образом:

#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;
}

Я хочу сделать то же самое с двумерным вектором, используя ту же технику(поскольку двумерный вектор в C обрабатывается как одномерный вектор), и я подумал, что сделаю это так:

#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);

, но я хотел бы понять, почему я не могу использовать синтаксис, подобный тому, который используется для одномерного вектора.

1 Ответ

3 голосов
/ 31 октября 2019

Когда вы используете имя массива (в Си нет «векторов»), оно «разлагается» на указатель на первый элемент массива. Это просто и понятно для простых (1D) массивов, но когда вы переходите к «2D» массивам, все становится сложнее. Прежде всего, термин «2D-массив» неоднозначен в C - есть массивы массивов и массивов указателей, каждый из которых может действовать как 2D-массив, но они очень разные.

В вашемВ этом случае у вас есть массив массивов, поэтому вы можете сделать что-то вроде:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...