0

我正在尝试使用指针将二维数组视为一维数组(因为这是我理解的内存中的方式)。我以为我有它,然后我发现我只是添加到 'a' 的 ASCII 值(并打印 abcdefghijkl 而不是 abcghidefjkl)。

如何重写我的 printf 语句以打印 abcghidefjkl?另外,我怎么能用整数和双精度来做到这一点(即 - 使用data2和data3)

int main()
{

int i = 0;
char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}};
int data2[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}};
double data3[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}};

for(i=0;i<12;i++)
{
printf("%c\n", **(data)+i*sizeof(char));
}

return 0;
}

谢谢!

4

2 回答 2

0

更改一行代码

#include "stdio.h"

    int main()
    {

    int i = 0;
    char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}};
    int data2[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}};
    double data3[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}};

    for(i=0;i<12;i++)
    {
    printf("%c\n", *(*data +i));   // here is the change
    }

    return 0;
    }
于 2013-10-02T15:18:12.000 回答
0

是的,以下数组确实位于单个内存块中:

char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}};

因此,只要您尝试访问仍在此数组范围内的元素,您就可以以任何您喜欢的方式对待它。像这样的简单指针算术可以:

int i;
char* ptr = &data[0][0];
for(i = 0; i < 12; i++)
    printf("%c ", *(ptr + i));

然而这会输出a b c g h i d e f j k l。要做到这一点,a b c d e f g h i j k l您可能必须使用更复杂的东西,例如:

int i,j;
char* ptr = &data[0][0];
// a b c d e f:
for(i = 0; i < 2; i++)
    for (j = 0; j < 3; ++j)
        printf("%c ", *(ptr + i*6 + j));
// g h i j k l:
for(i = 0; i < 2; i++)
    for (j = 0; j < 3; ++j)
        printf("%c ", *(ptr + i*6 + j + 3));

sizeof(char)请注意,它由将始终返回的标准保证1,因此可以省略。在 s 数组的情况下int,代码只需要 2 处更改:ptr必须声明为int*并且printf应该使用%d说明符。您仍然不必使用sizeof.

于 2013-10-02T15:31:14.073 回答