我正在尝试使用指针将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;
}
谢谢!
答案 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
。