返回第五十一章 指针(六)(1 / 2)程序媛养成计划首页

「哦,晓得了。」

老爹说这些的确是现实中存在的问题,班上就有很多同学的家长不让他们玩儿手机和电脑,说是会影响到学习。一方为了防止对方玩儿手机,另一方想突破对方的封锁,于是双方展开了一场场斗智斗勇,各有输赢。

这大概就和老爹说的一样吧,不能单纯地从某个方面来看待这件事情。学习成绩好的人有玩儿手机和电脑的,学习成绩不好的也有不玩儿手机和电脑的,关键还是在于使用者如何使用吧。

当然了,一般来说小孩儿的自制能力比较差,这个时候就需要家长合理的管控了。毋庸置疑的是,老爹在这一点做得非常好。

「好了好了,闲话就说到这里,咱们还是继续说函数和指针之间那点事儿。其实函数和指针的关系也挺简单的,无非就三种情况:指针作为函数参数,函数返回值为指针。

其中指针作为函数参数又有两种情况,第一是指针变量指向的是数据,如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获取了这个数组的指针地址,然后对其修改,自然不会出任何问题。」

小弦子不愧是小弦子,我都还没有来得及尝试运行代码,他居然凭空推算出来了结果,不佩服真的不行。

「嗯,不错,的确是这样。这就是指针作为返回值的用法,应该没有什么难度吧?」

若是按照老爹例程代码来看,好像确实没有什么难度。

「不过返回一个指针,一定要确保这个指针是可用的,如果你返回的指针地址是函数中的一个局部变量,就可能引发不可预知的错误。

因为局部变量在函数执行结束后就被回收了,这时如果通过指针来访问一个被释放的了内存,会引发的后果是真的无法预料。」