「哦,晓得了。」
老爹说这些的确是现实中存在的问题,班上就有很多同学的家长不让他们玩儿手机和电脑,说是会影响到学习。一方为了防止对方玩儿手机,另一方想突破对方的封锁,于是双方展开了一场场斗智斗勇,各有输赢。
这大概就和老爹说的一样吧,不能单纯地从某个方面来看待这件事情。学习成绩好的人有玩儿手机和电脑的,学习成绩不好的也有不玩儿手机和电脑的,关键还是在于使用者如何使用吧。
当然了,一般来说小孩儿的自制能力比较差,这个时候就需要家长合理的管控了。毋庸置疑的是,老爹在这一点做得非常好。
「好了好了,闲话就说到这里,咱们还是继续说函数和指针之间那点事儿。其实函数和指针的关系也挺简单的,无非就三种情况:指针作为函数参数,函数返回值为指针。
其中指针作为函数参数又有两种情况,第一是指针变量指向的是数据,如int、double以及结构体或者枚举这种,还有一种特例,那就是指针变量指向的是一个函数,我们把一个函数A的指针作为参数传给另一个函数B,这样在函数B中就可以通过这个指针调用函数A了,这就是所谓的回调函数。
概念性的东西咱们就先说到这里,还是以实际的例子来说明吧。
首先说普通指针作为函数的参数,其实这种情况你们已经见识过了,我一开始说到的swap函数就是这样了。我相信通过之前的讲解,你们对这个函数的理解已经算是比较透彻了,这里我们就不再赘述。
所以我们接下来看看当指针作为一个函数的返回值的这种情况,比如说我们来实现一个函数,功能是把给定的字符串转成大写的,并把转换后的字符串返回。
由于字符串是一个char*,正好满足指针作为返回值。
typede char* String;
String toUpperCase(String str)
{
const char delta ='A''a';
String temp = str;
while (*temp !='0')
{
i ('a'<=*temp &&*temp <='z')
{
*temp =*temp + delta;
}
temp++;
}
return str;
}
因为我们已经给char*定义了一个String别名,所以我们在代码中就使用它,比较利于阅读理解。
在使用这个函数的时候,我们就能够体会到char*和char[]的区别了。
String str =“hello world“;
String result = toUpperCase(str);
将会报错,而
char[] str =“hello world“;
String result = toUpperCase(str);
却能够得到正确的结果,至于为什么会这样,结合字符串是常量的概念,以你们现在的水品来说,应该是能够明白这其中的道理的。」
老爹笑了笑。
「第一种情况str是一个指针,它直接指向了一个常量,而toUpperCase()却试图修改一个常量的值,所以在运行的时候报错了。
但是第二种情况str是一个数组,没有任何限制,在函数中temp获取了这个数组的指针地址,然后对其修改,自然不会出任何问题。」
小弦子不愧是小弦子,我都还没有来得及尝试运行代码,他居然凭空推算出来了结果,不佩服真的不行。
「嗯,不错,的确是这样。这就是指针作为返回值的用法,应该没有什么难度吧?」
若是按照老爹例程代码来看,好像确实没有什么难度。
「不过返回一个指针,一定要确保这个指针是可用的,如果你返回的指针地址是函数中的一个局部变量,就可能引发不可预知的错误。
因为局部变量在函数执行结束后就被回收了,这时如果通过指针来访问一个被释放的了内存,会引发的后果是真的无法预料。」