【问题标题】:How to use several pointers to one twodimensional array in c?如何在c中使用多个指向一个二维数组的指针?
【发布时间】:2020-04-27 11:37:04
【问题描述】:

我想在 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];

【问题讨论】:

  • char (*myptr)[20]; 创建一个char [20]pointer-to-array。然后myptr = name;char *s = name[1];char *t = name[2];。对于myptr,您将有myptrr[0] 指向name[0]myptr[1] 指向name[1],依此类推。对于st,它们是指向name[1]name[2] 中各个字符的指针。
  • 是否要将指针连接到数组行??

标签: c arrays pointers implicit-conversion


【解决方案1】:

这样声明的数组

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];

【讨论】:

    【解决方案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]);
    }
    

    【讨论】:

      【解决方案3】:

      您可以通过使用指针分配的简短练习来完善您的问题。例如,从上面的评论继续,将myptr 创建为char[20]stpointer-to-araychar[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;
          }
      }
      

      使用/输出示例

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

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

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 2018-01-04
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        • 2016-05-08
        相关资源
        最近更新 更多