一起talk C栗子吧(第六十八回:C语言实例--DIY字符串长度函数的小疑问)
2015-11-29 21:09
477 查看
各位看官们,大家好,上一回中咱们说的是DIY字符串长度函数的例子,这一回咱们说的例子是:DIY字符串长度函数的小疑问。闲话休提,言归正转。让我们一起talk C栗子吧!
看官们,我们在上一回中介绍了字符串长度函数strlen,并且自己DIY了一个字符串长度函数,该函数的原理比较简单,实现也容易,不过有一些看官们提出了疑问,因此我们专门解答一下。
size_t其实是一个无符号整数类型. 即:unsigned int或者unsigned long.标准库这样做是为了确保可以得到一个正数,当使用它做数组下标时不会因为得到负数而造成数组越界。
此外,不同的机器,对int和long使用不同的字节进行存储,比如x86使用四个字节存储int类型的变量,有些机器则使用两个字节存储int的变量。当使用int类型的变量在这两种机器上时,就会得到不同的结果。而使用size_t这种类型的变量,就不会有这种情况发生。可以说该类型的移植性比较好。
在实际工作中,我也推荐大家使用size_t这种类型。在上一回中,我们使用的是int,只是为了说明字符串长度的函数的工作原理,没有想这么多的细节。所以能提出这种问题的看官,值得表扬。
为了方便解释,我们把上一回中的函数放到这里来。
通过上面的函数,我们可以看到,我们在DIY函数中直接操作s1,标准库函数中是操作局部指针sc。其实,调用DIY的函数时,传递给该函数的是指针的值,我们操作的就是这个值,而不是指针本身。如果想修改传递给函数的指针,那么函数的参数必须是一个二级指针才可以。这么说,大家可能觉得有些抽象,我们举一个实际的例子来说明。
我们在主函数中使用DIY函数来求字符串的长度。
大家可以看到,我们在使用DIY函数前先输出指针p指向字符串的内容,使用完DIY函数后再输出一次。下面是
程序的运行结果:
从结果中,大家可以看到,使用DIY函数前后的输出结果是一致的,也就是说DIY函数不会修改传递给它的指针。提疑问的看官是想说,DIY函数会改变例子中p本身的值,使其指向不同的地方。
我们借用这个例子来解释一下,以免让大家觉得抽象。DIY函数实际上操作的是p的值,而不是p本身,因为使用DIY函数时,传递给函数的是p的值,而不是p本身。所以不会影响p。如果DIY函数的参数是一个二级指针,这时候把p传递给函数时,就会影响p本身。这么说,不知道大家是不是能够理解,如果不理解的话,可以参考C语言类书箱中关于二级指针的内容。真正掌握了二级指针的内容后,理解这个问题就容易多了。
看官们能够提出这样的疑问,说明在积极地考虑,而不是被动地听我给大家介绍。希望大家能够向提疑问的看官学习,变被动为主动,这样就能深刻地掌握我们小说中的内容。
各位看官,关于DIY字符串长度函数小疑问的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。
看官们,我们在上一回中介绍了字符串长度函数strlen,并且自己DIY了一个字符串长度函数,该函数的原理比较简单,实现也容易,不过有一些看官们提出了疑问,因此我们专门解答一下。
疑问一
标准库中的size_t和我们使用的int有什么区别。size_t其实是一个无符号整数类型. 即:unsigned int或者unsigned long.标准库这样做是为了确保可以得到一个正数,当使用它做数组下标时不会因为得到负数而造成数组越界。
此外,不同的机器,对int和long使用不同的字节进行存储,比如x86使用四个字节存储int类型的变量,有些机器则使用两个字节存储int的变量。当使用int类型的变量在这两种机器上时,就会得到不同的结果。而使用size_t这种类型的变量,就不会有这种情况发生。可以说该类型的移植性比较好。
在实际工作中,我也推荐大家使用size_t这种类型。在上一回中,我们使用的是int,只是为了说明字符串长度的函数的工作原理,没有想这么多的细节。所以能提出这种问题的看官,值得表扬。
疑问二
标准库中定义了一个指针sc,然后操作sc。我们在DIY时没有定义指针,直接在原指针上进行操作,会不会改变原指针的值。答案是不会。下面我来解释原因。为了方便解释,我们把上一回中的函数放到这里来。
int diy_strlen(const char *s1) { int len = 0; if(NULL == s1) return 0; while(*s1 != '\0') { s1++; len++; } return len; }
/** * strlen - Find the length of a string * @s: The string to be sized */ size_t strlen(const char *s) { const char *sc; for (sc = s; *sc != '\0'; ++sc) /* nothing */; return sc - s; }
通过上面的函数,我们可以看到,我们在DIY函数中直接操作s1,标准库函数中是操作局部指针sc。其实,调用DIY的函数时,传递给该函数的是指针的值,我们操作的就是这个值,而不是指针本身。如果想修改传递给函数的指针,那么函数的参数必须是一个二级指针才可以。这么说,大家可能觉得有些抽象,我们举一个实际的例子来说明。
我们在主函数中使用DIY函数来求字符串的长度。
int main() { int len = 0; char *p = "good question"; printf("%s \n",p); len = diy_strlen(p); printf("%d \n",len); printf("%s \n",p); return 0; }
大家可以看到,我们在使用DIY函数前先输出指针p指向字符串的内容,使用完DIY函数后再输出一次。下面是
程序的运行结果:
good question 13 good question
从结果中,大家可以看到,使用DIY函数前后的输出结果是一致的,也就是说DIY函数不会修改传递给它的指针。提疑问的看官是想说,DIY函数会改变例子中p本身的值,使其指向不同的地方。
我们借用这个例子来解释一下,以免让大家觉得抽象。DIY函数实际上操作的是p的值,而不是p本身,因为使用DIY函数时,传递给函数的是p的值,而不是p本身。所以不会影响p。如果DIY函数的参数是一个二级指针,这时候把p传递给函数时,就会影响p本身。这么说,不知道大家是不是能够理解,如果不理解的话,可以参考C语言类书箱中关于二级指针的内容。真正掌握了二级指针的内容后,理解这个问题就容易多了。
看官们能够提出这样的疑问,说明在积极地考虑,而不是被动地听我给大家介绍。希望大家能够向提疑问的看官学习,变被动为主动,这样就能深刻地掌握我们小说中的内容。
各位看官,关于DIY字符串长度函数小疑问的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。
相关文章推荐
- 【C语言提高02】数据类型本质
- C++实现输入输出运算符重载、友元函数和成员函数实现复数类Complex
- C++学习笔记——一只P转C的OIer的学习历程
- 【C语言提高01】冒泡排序和数组做参数的问题
- 黑马程序员——基础笔记:初始C语言
- C++静态成员变量和静态成员函数
- c语言:判断一个字符串中是否含有字符C
- C++ 之函数调用操作符和函数对象
- c语言:输出一个静态局部变量只在函数内部有效的例子
- c++ 模板
- 关于内存对齐的感悟
- C++11学习笔记(三)
- C++ 类的前置声明
- C++学习笔记31——类的基础概念
- C++Builder 自定义消息 处理
- C++类型转化小结
- C++重载下标操作符
- 深度剖析C语言可变参数列表
- C++解引用与箭头操作符重载
- C++ 重载自增和自减操作符