# 字符数组数组的非顺序访问

• ### 问题

• //数据结构：

typedef struct square{
int border;
char * graph;
square(int b){
border = b;
graph = (char*)malloc(b * b);
}
} Square;

//定义：

Square change = square(6);

//初始化

...

//处理

border = change.border;

printf("顺序输出的结果:\n");
for(int i=0; i<border; i++){
for(int j=0; j<border; j++){
printf("(%d, %d) = %c  ", i, j, change.graph[change.border*i+j]);
}
printf("\n");
}
printf("跳着输出的结果:\n");
for(int i=0; i<border; i++){
for(int j=0; j<border; j++){
printf("(%d, %d) = %c  ", border-1-j, i, change.graph[change.border*(border-1-j)+i]);
}
printf("\n");
}

输出的结果：

第一个square:
顺序输出的结果:
(0, 0) = o  (0, 1) = o  (0, 2) = o  (0, 3) = b
(1, 0) = o  (1, 1) = o  (1, 2) = o  (1, 3) = o
(2, 0) = b  (2, 1) = b  (2, 2) = o  (2, 3) = o
(3, 0) = o  (3, 1) = o  (3, 2) = b  (3, 3) = o
跳着输出的结果:
(3, 0) = o  (2, 0) = b  (1, 0) = o  (0, 0) = o
(3, 1) = ? (2, 1) = o  (1, 1) = b  (0, 1) = o
(3, 2) = ? (2, 2) = ? (1, 2) = o  (0, 2) = b
(3, 3) = ? (2, 3) = ? (1, 3) = ? (0, 3) = o

第二个square:
顺序输出的结果:
(0, 0) = o  (0, 1) = b  (0, 2) = o  (0, 3) = o  (0, 4) = o
(1, 0) = o  (1, 1) = o  (1, 2) = b  (1, 3) = o  (1, 4) = o
(2, 0) = o  (2, 1) = o  (2, 2) = b  (2, 3) = o  (2, 4) = o
(3, 0) = o  (3, 1) = o  (3, 2) = o  (3, 3) = o  (3, 4) = b
(4, 0) = b  (4, 1) = o  (4, 2) = o  (4, 3) = o  (4, 4) = o
跳着输出的结果:
(4, 0) = o  (3, 0) = o  (2, 0) = o  (1, 0) = o  (0, 0) = b
(4, 1) = ? (3, 1) = o  (2, 1) = o  (1, 1) = o  (0, 1) = o
(4, 2) = ? (3, 2) = ? (2, 2) = o  (1, 2) = o  (0, 2) = o
(4, 3) = ? (3, 3) = ? (2, 3) = ? (1, 3) = o  (0, 3) = o
(4, 4) = ? (3, 4) = ? (2, 4) = ? (1, 4) = ? (0, 4) = o

第三个square:
顺序输出的结果:
(0, 0) = o  (0, 1) = o  (0, 2) = b  (0, 3) = o
(1, 0) = b  (1, 1) = o  (1, 2) = o  (1, 3) = o
(2, 0) = o  (2, 1) = o  (2, 2) = b  (2, 3) = b
(3, 0) = o  (3, 1) = o  (3, 2) = o  (3, 3) = o
跳着输出的结果:
(3, 0) = o  (2, 0) = o  (1, 0) = o  (0, 0) = o
(3, 1) = ? (2, 1) = o  (1, 1) = o  (0, 1) = o
(3, 2) = ? (2, 2) = ? (1, 2) = o  (0, 2) = o
(3, 3) = ? (2, 3) = ? (1, 3) = ? (0, 3) = o

疑问：顺序输出的结果是正确的，为什么跳着输出就错了呢？

2010年11月14日 23:44

### 答案

• 你确定程序其他位置没有修改change.graph的值么？

我用你的代码试了一下

没有问题啊

• 已标记为答案 2010年11月15日 5:02
2010年11月15日 2:38

### 全部回复

• 呼唤高手啊！！！！
2010年11月15日 2:09
• 你确定程序其他位置没有修改change.graph的值么？

我用你的代码试了一下

没有问题啊

• 已标记为答案 2010年11月15日 5:02
2010年11月15日 2:38
• 对不起大家了，是我弄错了。谢谢向立天！

错误是，定义了#define ORIGINAL_SQUARE(i,j) original.graph[original.border*i+j]

在后面使用的时候直接使用ORIGINAL_SQUARE(border-1-j,i)，导致错误，正确的使用方法：ORIGINAL_SQUARE((border-1-j),i)

2010年11月15日 5:01