如何在c中使用多个指向一个二维数组的指针?

How to use several pointers to one twodimensional array in c?

我想在 c 中的数组上创建指针。例如,我有一个数组

char arr1[4][20];

我想制作指针,这些指针会像这个指针一样获得内存 p = arr1[0][0-20] t = arr1[1][0-20],u = arr[1][0-20]。我想将来自不同文件的所有字符串保存在一个数组中。 我尝试做类似的事情,但它不起作用。

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

以下是声明指向 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]);
}

这样声明的数组

char name[20][20];

用在表达式中,例如初始化器被隐式转换为指向其第一个类型为 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];

您可以通过使用指针赋值的简短练习来完善您的问题。例如从上面的评论继续,创建 myptr 作为 指针到数组 char[20]stchar[20] 的数组,你可以这样做:

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

例子Use/Output

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

问题:空字符串作为上面代码中name的最后一个元素有什么用?