C - 使用指向字符数组的指针打印网格

时间:2014-07-03 22:59:12

标签: c arrays pointers

我正在进行一项练习:

“编写一个声明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;
}

4 个答案:

答案 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)。

  1. “*(ptr + ctr1)” - &gt; char *“ - &gt;数组的行,每个都是一个字符指针

  2. “*(expr(1)+ ctr2) - &gt; char” - &gt;每行中的项目,每个项目都是一个字符。