Как использовать несколько указателей на один двумерный массив в c? - PullRequest
1 голос
/ 27 апреля 2020

Я хочу создать указатели на массив в c. Например, у меня есть массив

char arr1[4][20];

Я хочу сделать указатели, и эти указатели будут получать память, как этот указатель p = arr1 [0] [0-20] t = arr1 [1] [0- 20], u = обр [1] [0-20]. Я хочу сохранить все строки из разных файлов в одном массиве. Я пытаюсь сделать что-то подобное, но это не работает.

char name[20][20];
char *s[20];
char *t[20];
s = name[1];
t = name[2];

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

Массив, объявленный как этот

char name[20][20];

, используемый в выражениях, например, в качестве инициализатора, неявно преобразуется в указатель на его элемент firs, который имеет тип char ( * )[20].

. Вы можете написать, например,

char ( *s )[20] = name;

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

( *s )[0], ( *s )[1], an so on

или как

s[0][0], s[0][1], and so on.

Проще будет проходить массивы заостренных символов, если указатель будет объявлен как

char *s = name[0];
char *t = name[1];

и т. Д.

То есть вы должны объявлять указатели как

char ( *s )[20] = name;
char ( *t )[20] = name + 1;

или как

char *s = name[0];
char *t = name[1];
1 голос
/ 27 апреля 2020

Вы можете завершить свой вопрос коротким упражнением, используя указатели для использования. Например, продолжая комментарий выше, с созданием myptr в качестве указателя на массив из char[20] и s и t для массива char[20], вы можете do:

#include <stdio.h>

int main (void) {

    const char name[20][20] = { "Mickey Mouse", "Minnie Mouse", "Pluto",
                                "Bugs Bunny", "Porky Pig", "Daffy Duck", "" },
                (*myptr)[20] = name;

    while (1) {
        const char *s = *myptr++, *t = *myptr++;

        if (*s)
            puts (s);
        else
            break;

        if (*t)
            puts (t);
        else
            break;
    }
}

Пример использования / Вывод

$ ./bin/ptr2arrexercise
Mickey Mouse
Minnie Mouse
Pluto
Bugs Bunny
Porky Pig
Daffy Duck

Вопрос: Для какой цели пустая строка служит последним элементом name в код выше?

1 голос
/ 27 апреля 2020

Вот как вы объявляете указатель на массив из 20 элементов:

char (*ptr)[20];

Итак, вот как вы делаете то, что вы хотите сделать:

char name[20][20];
char (*s)[20] = &name[1]; // note the &
char (*t)[20] = &name[2];

И вот как Вы получите доступ к элементам этих массивов позже:

for (size_t i = 0; i < sizeof(*s); ++i) {
  printf("%d ", (*s)[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...