我正在进行一项练习:
“编写一个声明12x12字符数组的程序。将X放在每个其他元素中。使用指向数组的指针以网格格式将值打印到屏幕上。”
编译时,我的代码提供奇怪的字符而不是X字符。我的代码如下:
#include <stdio.h>
int main(void)
{
char multi[12][12];
char (*ptr)[12];
ptr = multi;
int ctr1, ctr2;
for (ctr1 = 0; ctr1 < 12; ctr1++)
{
for (ctr2 = 0; ctr2 < 12; ctr2++)
{
if ((ctr2 % 2) == 0)
{
multi[ctr1][ctr2] = 'X';
}
else
{
multi[ctr1][ctr2] = ' ';
}
}
}
for (ctr1 = 0; ctr1 < 12; ctr1++)
{
for (ctr2 = 0; ctr2 < 12; ctr2++)
{
printf("%c\t", *ptr++);
}
printf("\n");
}
return 0;
}
答案 0 :(得分:2)
变量ptr
被声明为指向char[12]
的指针。因此,当您使用ptr
进行后递增时,编译器会将{12}添加到ptr++
。考虑到循环的写入方式,您只希望ptr
在递增时前进1。
因此,您可以通过将ptr
声明为简单char *
来解决此问题。这是因为二维数组的行在内存中是连续的,所以递增超过行的末尾只会将指针移动到下一行的第一个元素。
或者您可以使用现有的char (*)[12]
进行修复。要做到这一点,您需要了解递增ptr
会将指针移动到数组的下一行。要访问当前行的各个列,只需将ptr
变量视为一维数组即可。因此,代码看起来像这样
for ( row = 0; row < 12; row++ )
{
for ( col = 0; col < 12; col++ )
{
printf( "%c\t", (*ptr)[col] ); // print out the columns for the current row
}
printf("\n");
ptr++; // move to the next row
}
答案 1 :(得分:2)
ptr
指向一次整行的数组。当你递增它时,它会移动到下一行。
一种解决方案就是索引它,然后从技术上讲你已经使用了一个指针:
for (ctr1 = 0; ctr1 < 12; ctr1++)
{
for (ctr2 = 0; ctr2 < 12; ctr2++)
{
printf("%c\t", ptr[ctr1][ctr2]);
}
printf("\n");
}
然而,问题的可能性可能是使用char *
来平和&#34;数组,他们在问题中使用了草率的语言:
char *ptr = (char *)&multi;
// ...
printf("%c\t", *ptr++);
答案 2 :(得分:0)
检查代码的注释。您应该使用一个指向数组的简单指针,如赋值所示。
#include <stdio.h>
int main(void)
{
char multi[12][12];
// The assignment says, use a pointer to the array.
// Our array holds characters, thus we need a pointer to char.
char *p;
// Assign where multi points to, as value of p.
// Now p points at the 1st element of multi, i.e. multi[0][0]
p = *multi;
int ctr1, ctr2;
for (ctr1 = 0; ctr1 < 12; ctr1++)
{
for (ctr2 = 0; ctr2 < 12; ctr2++)
{
if ((ctr2 % 2) == 0)
{
multi[ctr1][ctr2] = 'X';
}
else
{
multi[ctr1][ctr2] = ' ';
}
}
}
for (ctr1 = 0; ctr1 < 12; ctr1++)
{
for (ctr2 = 0; ctr2 < 12; ctr2++)
{
// Remember that * operator has higher priority than ++
printf("%c\t", *p++);
}
printf("\n");
}
return 0;
}
输出:
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
答案 3 :(得分:0)
编译时,我的代码提供奇怪的字符而不是X字符。我的代码如下:
我修改了你的代码如下:
#include <stdio.h>
int main(void)
{
char multi[12][12];
char (*ptr)[12];
ptr = multi;
int ctr1, ctr2;
for (ctr1 = 0; ctr1 < 12; ctr1++)
{
for (ctr2 = 0; ctr2 < 12; ctr2++)
{
if ((ctr2 % 2) == 0)
{
multi[ctr1][ctr2] = 'X';
}
else
{
multi[ctr1][ctr2] = ' ';
}
}
}
for (ctr1 = 0; ctr1 < 12; ctr1++)
{
for (ctr2 = 0; ctr2 < 12; ctr2++)
{
printf("%c\t", *(*(ptr+ctr1)+ctr2) );
}
printf("\n");
}
}
您将注意到以下内容:
printf("%c\t", *(*(ptr+ctr1)+ctr2) );
理由:
char(* ptr)[12];
表示ptr,这是一个包含12个指向char(c declaration syntax)的指针的数组。
数组decays into pointers的名称,因此:
ptr是一个由12个“char指针”组成的数组。这表示双下标数组的12行(或12个数组到char,它们的每个第一项都能够衰减到指向chars的指针)。如果你取消引用ptr,你得到一个“指向char的指针”,因为它衰减到指向“数组到字符”的指针,每个人自己都衰变为“指向char数组的指针”(如果取消引用则给出一个char)。
“*(ptr + ctr1)” - &gt; char *“ - &gt;数组的行,每个都是一个字符指针
“*(expr(1)+ ctr2) - &gt; char” - &gt;每行中的项目,每个项目都是一个字符。