#include <stdio.h>
void addBlack(int n,int m);
void addWhite(int n,int m);
void cleanChessBoard(char* CB,int n);
void judge(void);
char chessBoard[14][14]; //全局变量chessBoard[14][14]已定义
int main(){
char* CB;
//char chessBoard[14][14]; //chessBoard已定义为全局变量,你cleanChessBoard(char* CB,int n);函数体中的打印也是操作的全局变量
//CB = &chessBoard[14][14]; //这样取地址根本就不对,chessBoard[14][14]代表的是第15行第15个元素,而你数组下表是0~13。这里你一定要加强理解。
//如果你本意想取整个数组的地址,这样你需要定义CB为char(*) [14][14]类型,即定义为char(*CB) [14][14] = &chessBoard;
//CB = (char*) &chessBoard; //如果你就是很执着的想,CB定义为char* CB;,而又要通过CB=&chessBoard;来获取地址,
//那么你可以修改为CB = (char *)&chessBoard;,这样就强制转换了指针类型。
//CB为char* 类型,你是想取得是数组的首地址,所以应该修改为:
CB = &chessBoard[0][0]; //CB指向全局变量的第一个元素,这时CB只知道它指向的是一个char元素,不知道指向的是一个数组
cleanChessBoard(CB,14);
return 0;
}
//void cleanChessboard(char* CB,int n){ //函数名定义字母写错大写的B写成了小写的b
void cleanChessBoard(char* CB,int n){
int i,j;
for(i = 0;i < n;i++){
for(j = 0;j < n;j++){
if(i == 0 ){
//*(*(CB + i) + j) = (char)j ; //用这种二维数组的指针直接作为参数传递时,
//数组名退化为指针,函数并不知道数组的列数,
//n对它来说是不可见的,即便使用*(*(CB + i) + j)。第一层解引用失败
//为了指导这个函数如何解引用,也就是要人为地解引用,需要把这个二维数组的首元素地址传给函数,
//于是就变成了下面的形式:
*((CB + i*n) + j) = (char)j ;
}
else{
//*(*(CB + i) + j) = '*' //这段代码结束缺少结束“;”号。同上也需要人为地解引用
*((CB + i*n) + j) = '*';
}
printf("%c",chessBoard[i][j]); //这里打印的是全局变量chessBoard[i][j]
printf(" ");
}
}
}
|