如何使用指向二维char数组的指针?

时间:2016-02-20 21:23:05

标签: c arrays pointers

我正在尝试使用带有2d char数组(a [] [])的指针(* test)。但我似乎无法弄清楚做到这一点的正确方法是什么。我设法让它使用int数组和int指针,但当我更改为char时,相同的解决方案不起作用。我认为我只是幸运地有了整数,并没有真正有一个合适的解决方案。我想使用指针算法进行迭代,如代码中所示。我目前的输出是胡言乱语。

char a[WIDTH][HEIGHT] = { {'a','b'},{'c','d'},{'e','f'} };

char *test = (char *)a[0][0];

int x,y;

for (x = 0; x < WIDTH; x++)
  {
    for (y = 0; y < HEIGHT; y++)
    {
      printf("%c", test);
      test = test + 1;
    }
    printf("\n");
  }

2 个答案:

答案 0 :(得分:1)

printf("%c", test);

您试图打印角色的地址,而不是它的价值。取消引用指针以访问值:

printf("%c", *test);

此外,您需要将指针设置为实际指向数组中第一个元素的地址。目前,您强制指针滥用其值作为地址:

char *test = (char *)a[0][0];

将其更改为

char *test = &(a[0][0]);

一般情况下,您应该在启用所有警告的情况下进行编译,并将其中的每一个警告视为错误,除非您完全确定它不是。除非你绝对确定你需要一个演员阵容,否则你也应该尝试没有任何演员表,因为演员阵容可能会使有用的编译器警告无声。

最后,我想补充一点,在我看来,这似乎是一种迭代阵列的方法,而这个阵列只是在询问未来的问题。如果要表达连续内存,请使用单个(1D)数组。如果你想要网格访问,使用2D数组甚至更好,提供具有表达名称的函数。

答案 1 :(得分:1)

两个主要问题是

  1. 您正在将a[0][0]的值分配给test并投射以使编译器警告静音,您应该指定只是a的地址。

    char *test = (char *) a;
    

    或者

    char *test = (char *) a[0];
    

    这是因为数组值在内存中有条理地存储,但请注意,如果你动态创建2维数组,则不应该依赖于此,因为这需要一个指针数组,因此值将不再是有条不紊地存放。

  2. 当您使用printf()说明符时,您正在向"%c"传递指针,此说明符需要char参数,因此它应该是

    printf("%c", *test);