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


各位看官们,大家好,上一回中咱们说的是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字符串长度函数小疑问的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值