您的位置:首页 > 编程语言 > C语言/C++

一起talk C栗子吧(第六十八回:C语言实例--DIY字符串长度函数的小疑问)

2015-11-29 21:09 477 查看
各位看官们,大家好,上一回中咱们说的是DIY字符串长度函数的例子,这一回咱们说的例子是:DIY字符串长度函数的小疑问。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们在上一回中介绍了字符串长度函数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字符串长度函数小疑问的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: