我试图使用指针将2D数组视为一维数组(据我理解,这是内存中的方式)。我认为我有它,然后我发现我只是增加'a‘的ASCII值(和打印abcdefghijkl而不是abcghidefjkl)。
如何重写我的printf语句打印abcghidefjkl?另外,我如何使用int和doubles (即使用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;
}谢谢!
发布于 2013-10-02 15:18:12
更改一行代码
#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-02 15:31:14
是的,以下数组确实驻留在单个内存块中:
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数组的情况下,代码只需要两个更改:ptr必须声明为int*,printf应该使用%d说明符。你还是不用使用sizeof。
https://stackoverflow.com/questions/19140404
复制相似问题