我正在尝试使用带有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");
}
答案 0 :(得分:1)
printf("%c", test);
您试图打印角色的地址,而不是它的价值。取消引用指针以访问值:
printf("%c", *test);
此外,您需要将指针设置为实际指向数组中第一个元素的地址。目前,您强制指针滥用其值作为地址:
char *test = (char *)a[0][0];
将其更改为
char *test = &(a[0][0]);
一般情况下,您应该在启用所有警告的情况下进行编译,并将其中的每一个警告视为错误,除非您完全确定它不是。除非你绝对确定你需要一个演员阵容,否则你也应该尝试没有任何演员表,因为演员阵容可能会使有用的编译器警告无声。
最后,我想补充一点,在我看来,这似乎是一种迭代阵列的方法,而这个阵列只是在询问未来的问题。如果要表达连续内存,请使用单个(1D)数组。如果你想要网格访问,使用2D数组甚至更好,提供具有表达名称的函数。
答案 1 :(得分:1)
两个主要问题是
您正在将a[0][0]
的值分配给test
并投射以使编译器警告静音,您应该指定只是a
的地址。
char *test = (char *) a;
或者
char *test = (char *) a[0];
这是因为数组值在内存中有条理地存储,但请注意,如果你动态创建2维数组,则不应该依赖于此,因为这需要一个指针数组,因此值将不再是有条不紊地存放。
当您使用printf()
说明符时,您正在向"%c"
传递指针,此说明符需要char
参数,因此它应该是
printf("%c", *test);