首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用指针线性访问2D数组

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

Stack Overflow用户
提问于 2013-10-02 15:14:42
回答 2查看 118关注 0票数 0

我试图使用指针将2D数组视为一维数组(据我理解,这是内存中的方式)。我认为我有它,然后我发现我只是增加'a‘的ASCII值(和打印abcdefghijkl而不是abcghidefjkl)。

如何重写我的printf语句打印abcghidefjkl?另外,我如何使用int和doubles (即使用data2和data3)来做到这一点?

代码语言:javascript
复制
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;
}

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-02 15:18:12

更改一行代码

代码语言:javascript
复制
#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;
    }
票数 0
EN

Stack Overflow用户

发布于 2013-10-02 15:31:14

是的,以下数组确实驻留在单个内存块中:

代码语言:javascript
复制
char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}};

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

代码语言:javascript
复制
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,您可能需要提供一些更复杂的东西,例如:

代码语言:javascript
复制
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数组的情况下,代码只需要两个更改:ptr必须声明为int*printf应该使用%d说明符。你还是不用使用sizeof

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19140404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档