在多维数组这里我重点想聊二维数组。大家先不要着急跳过这部分内容,因为很多人真的不了解什么才是二维数组,更何况多维数组。
我问过很多同学什么是二维数组,得到的答案往往是表示行列的数组。那么三维数组呢?四维五维数组呢?我要郑重的强调,数组本身只是一段连续的内存,不表示任何含义。大家经常说的二维数组表示行列,那只是开发者赋予它的逻辑意义。就像一杯水,你可以用来浇花、用来解渴,但你却不能说浇花和解渴就是水。
下面我定义一个二维数组来分析一下它的性质。
int arr[2][3] = {{1,2,3},{4,5,6}};
char **argv;
//argv:指针指向指针指向char。
/*
我的翻译:argv是一个指向指针的指针,所指向的指针指向char类型。就是我们常说的二级指针。
*/
int (*daytab)[13];
//daytab:指针指向13个int类型元素的数组。
/*
我的翻译:daytab是一个指针,指向一个13个元素的数组,该数组的元素类型是int。就是我们常说的数组指针。
*/
int *daytab[13];
//daytab:13个指向int类型指针元素的数组。
/*
我的翻译:daytab是一个13个元素的数组,数组的元素类型是int类型的指针。就是我们常说的指针数组。
*/
void *comp();
//comp:返回指向void类型指针的函数。
/*
我的翻译:comp是一个函数,函数的返回值类型是指向void类型的指针。就是我们常说的指针函数。
*/
void(*comp)();
//comp:指向返回值是void类型的函数的指针。
/*
我的翻译:comp是一个指针,指向的是一个返回值类型是void,参数列表是空的函数。就是我们常说的函数指针。
*/
char(*(*x())[])();
/*
太难了,我直接翻译吧!首先x是一个函数,函数的返回值是一个指向数组的指针,这个数组的元素类型是指向返回值是char类型函数的指针。这个由于太复杂了,所以并没有人给它起名字。
*/
char(*(*x[3])())[5];
/*
直接来了!首先x是一个3个元素的数组,数组的元素是指向函数的指针,函数的返回值是数组指针,所指向的数组是5个char类型的元素。
*/
void printArr(int(*p)[3], int len);
int main()
{
int arr[2][3] = {1,2,3,4,5,6};
printArr(arr, 2);//分行打印arr数组
return 0;
}
void printArr(int(*p)[3], int len)
{
int i,j;
for(i = 0;i < len;i++)//遍历指针p指向的数组
{
for(j = 0;j < 3;j++)//遍历每个元素数组
{
printf("%d ", p[i][j]);
}
printf("\n");
}
}
void printArr(int *p, int len);
void sortUp(int *p, int len);
void sortDown(int *p, int len);
int main()
{
int arr[10] = {21,3,43,5,67,89,9,4,13,2};
sortUp(arr, 10);
printArr(arr, 10);
sortDown(arr, 10);
printArr(arr, 10);
return 0;
}
void sortUp(int *p, int len)
{
int i,j;
for(i = 0;i < len-1;i++)
{
for(j = 0;j < len-1-i;j++)
{
if(p[j] > p[j+1])
{
int t = p[j];
p[j] = p[j+1];
p[j+1] = t;
}
}
}
}
void sortDown(int *p, int len)
{
int i,j;
for(i = 0;i < len-1;i++)
{
for(j = 0;j < len-1-i;j++)
{
if(p[j] < p[j+1])
{
int t = p[j];
p[j] = p[j+1];
p[j+1] = t;
}
}
}
}
void printArr(int *p, int len)
{
int i;
for(i = 0;i < len;i++)
{
printf("%d ", p[i]);
}
printf("\n");
}
void printArr(int *p, int len);
void sort(int *p, int len, int(*cmp)(int,int));
int cmpUp(int a, int b);
int cmpDown(int a, int b);
int main()
{
int arr[10] = {21,3,43,5,67,89,9,4,13,2};
sort(arr, 10, cmpUp);
printArr(arr, 10);
sort(arr, 10, cmpDown);
printArr(arr, 10);
return 0;
}
void sort(int *p, int len, int(*cmp)(int,int))
{
int i,j;
for(i = 0;i < len-1;i++)
{
for(j = 0;j < len-1-i;j++)
{
if(cmp(p[j], p[j+1]))
{
int t = p[j];
p[j] = p[j+1];
p[j+1] = t;
}
}
}
}
int cmpUp(int a, int b)
{
return a > b;
}
int cmpDown(int a, int b)
{
return a < b;
}
void printArr(int *p, int len)
{
int i;
for(i = 0;i < len;i++)
{
printf("%d ", p[i]);
}
printf("\n");
}
struct Hero
{
int act;
int def;
int hp;
};
int main()
{
struct Hero superMan;
superMan.act = 100;
superMan.def = 50;
superMan.hp = 500;
return 0;
}
enum Debuff
{
dizziness,//眩晕
toxic, //中毒
freezing //冰冻
};
void showDebuff(enum Debuff db);
int main()
{
showDebuff(dizziness);
return 0;
}
void showDebuff(enum Debuff db)
{
switch (db) {
case dizziness:
printf("眩晕了\n");
break;
case toxic:
printf("中毒了\n");
break;
case freezing:
printf("冰冻了\n");
break;
}
}