通过讲解main函数,我基本上知道了指针数组的用法了。
「还记不得记得我们在讲二维数组的时候,我说二维数组其实是一个一维数组,不过这个一维数组的元素也是一维数组。在说到为其赋值时,你问我可不可以将数组赋值给二维数组的元素,我说按照正规操作是不行的,但是咱么借助指针数组就可以实现。
在讲指针和数组的用法时,我们已经知道了,指针是可以指向一个一维数组的,那么如果是一个指针数组,自然就可以表示一个二维数组了。
int* p[3];
int a0[]={0, 1, 2, 3, 4};
int a1[]={5, 6, 7, 8};
int a2[]={9, 10, 11};
p[0]= a0;
p[1]= a1;
p[2]= a2;」
「啥,这些一维数组的长度还可以不一样啊?」
「这是因为指针数组里面真的就只是存放了一维数组的指针地址,而数组的长度对于数组的指针地址没有影响。
但需要注意的是,每个元素指向的是一个真实存在的一维数组,所以在遍历的时候要考虑数组越界的问题。
指针数组咱们就差不多讲完了,接下来就剩最后一点内容,多重指针。今天上午已经讲了这么久了,咱们先休息一下,等到下午咱们争取把结构体和枚举说一下,最后再简单地过一遍文件指针,那么C语言的基础知识咱们就算是学习完了。」
说到此处,老爹徐徐吐出一口气。
从第一天开始学习C语言,到现在已经过去了40多个日日夜夜,这突然要结束了,心里突然有种空出一块的感觉。
吃了午饭后,我和老爹都习惯性躺在床上小眯了一会儿,小弦子就只能睡沙发了。
午休之后,老爹便如约开始讲多重指针。所谓的多重指针,就是指针里面放指针,这一点和多维数组倒是有些相似。指针变量和其他变量一样,都要存放在内存中,既然如此,就会有地址。
如果把指针变量A的地址取出来,赋值给另外一种数据类型声明的变量B,这种数据类型就叫做二重指针。以此类推,如果再把B的地址取出来赋值给另外一种数据类型声明的变量C,那么C的数据类型就叫做三重指针……
以上过程用代码表示:
int a = 0;
int* p =&a;
int** q =&p;
int*** r =&q;
……
在取值的时候:
*r代表的是q
**r 代表的是p
***r 代表的是a
老爹说二重指针除了用来考试或者面试,一般都极少看到。自此,和指针相关的知识就算是讲解完了。
相比其他知识点,指针的内容的确是多了很多。不仅体现在时间上,也体现子在老爹写的教学大纲上。从用时来说,以往的知识点从来都不会超过两个小时,而指针确实足足用了一上午都没有讲完!
从老爹教学大纲的篇幅上来说,指针部分的内容也是其他内容篇幅的两倍多。
「什么是枚举呢?所谓的枚举,就是将一个变量可能的值一一列举出来。比如说一周有七天,如果我们用一个变量的来表示一周中的某一天,那么它的可能值就是星期一到星期日。
同样,用一个变量来表示月份的话,它的可能值就是一月到十二月。
如果我们要表示星期和月份的话,就可以使用枚举。
定义枚举的格式很简单:
enum
{
Sunday = 0,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
} Week;
你们看,这就定义了一个星期的枚举类型,我们只指定了Sunday的值为0,后面的如果不指定,编译器会自动为其赋值为前一个值加一,所以Monday为1……Saturday为6。
当然了,我们也可以显式为所有字段都指定值,只需要保证每个字段的字不重复就可以了。」
「可是老爹,这样做有什么意义么?我们完全可以直接用数字0到6来表示一周啊。」
「的确是这样,但是你考虑到这个问题没有,不同的人定义的习惯可能不一样。比如说我们中国人数数习惯从1开始,那么有可能用1到7来分别表示星期一到星期天。
但是在程序的世界里,一切都是从0开始的,那么也有很多人像我刚才一样,使用0到6分别表示星期天到星期六。
如果时间太久了,我们可能就会忘记到底是使用哪种方式来表示的了,况且数字在使用的时候可读性也比较差。
但若是使用枚举,这些问题都迎刃而解了。我们要使用星期几,只需要使用它的英文名称就好了。不仅不会混乱,而且见名知意。」
「那也不一定非得使用这啊,我们还是可以定义常量,使用起来也比较方便啊。」
我很是不服气地说道。
「是的,其实在枚举刚出来的时候,很多人也跟你一样,毕竟习惯了使用定义常量的方式,但是后来就慢慢地接受了这种方式。
你非得要使用常量来定义,也没错,但是有些不合群。
这就好比大夏天其他人都穿着T恤,而你却穿着大红色羽绒服到处跑,别人也不能把你怎么样,毕竟不违法乱纪,也没有影响别人。所以自然不会有人把你拦住,非要你把羽绒服脱下来。
其他人只会在背后悄悄议论,说你怎样怎样。
写程序也是一样的,毕竟真正开发的时候代码不会只交给一个人来写或者维护。所以在写代码的时候就需要注意一些,不能太特立独行,最好还是采用大家都能够接受的风格。
呐,定义了枚举,我们就需要使用它。
枚举和其他数据类型一样,可以定义变量,只不过变量的值只能是定义的字段。例如:
enum week w = Friday;
或者定义在函数的形式参数上:
String weekToString(enum Week weekday)
{
switch (weekday)
{
case Sunday:
return “星期天“;
case Monday:
return “星期一“;
case Tuesday:
return “星期二“;
case Wednesday:
return “星期三“;
case Thursday:
return “星期四“;
case Friday:
return “星期五“;
case Saturday:
return “星期六“;
default:
return “错误“;
}
}
通过这两个例子可以看出,我们在声明一个枚举变量的时候,还需要加上一个enum关键字,看上去有些多余。
要解决这个问题,还是需要请typedef它老人家出马。如果在定义枚举的时候加上typedef,声明枚举变量的时候就不需要再使用enum关键字了:
typedef enum
{
Sunday = 0,
……
} Week;
声明变量:
week w = Friday;
String weekToString(Week weekday);」