使用指针线性访问2D数组

时间:2013-10-02 15:14:43

标签: c arrays pointers

我正在尝试使用指针将2D数组视为一维数组(因为这就是我对内存的理解)。我以为我拥有它,然后我发现我只是添加了'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;
}

谢谢!

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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,因此可以省略它。如果是int个数组,则代码只需要进行2次更改:ptr必须声明为int*printf应使用%d符。您仍然不必使用sizeof