玩转C语言---一些常见的问题

一、sizeof与strlen的区别

1、sizeof是一个操作符,适用于计算数组、变量、指针、类型符等所占内存空间的大小,它并不关注内存中存放的具体内容,不关心里面存放了多少数据;

2、strlen是一个用来计算字符串长度库函数,它只关心存储的数据内容,不关心空间大小和类型。

        那么为什么会有人把他俩分不清呢?关键点在于字符型数组。我们讲过C语言中,没有字符串类型,字符串是以字符型数组在内存中存放的,另外,在C语言系统中,字符数组存储字符串是会自动加上一个'\0'。这就容易把大家搞混,别急,我下面举例子说明:

例1:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[]={"Chian"};
    int ret =sizeof(arr1);
    int ret1 =sizeof(arr1)/sizeof(arr1[0]);
    int ret2=strlen(arr1);
    printf("%d\n",ret);
    printf("%d\n",ret1);
    printf("%d\n",ret2);
    return 0;
}

         我定义一个数组arr1,里面存放"China",

        当用sizeof(arr1)计算的是整个数组的长度,为6;

        当用sizeof(arr1)/sizeof(arr1[0])计算的是数组的长度/数组中一个元素的长度,计算数组的元素个数也为6;

        当用strlen(arr1)计算的数组中字符串的长度为5;

        数组arr1在内存中的存储方式如图所示,sizeof计算整数数组所占的字节,由于是字符串在数组中有'\0',所以计算占用6个字节,sizeof(arr1)/sizeof(arr1[0])是总字节(6)/单个字节(1),6个元素。strlen计算字符串长度,遇到'\0'截至,长度为5;数组长度不等于字符串长度;

 例2:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[]={'C','h','i','n','a'};
    int ret =sizeof(arr1);
    int ret1 =sizeof(arr1)/sizeof(arr1[0]);
    int ret2=strlen(arr1);
    printf("%d\n",ret);
    printf("%d\n",ret1);
    printf("%d\n",ret2);
    return 0;
}

二、数组长度为什么不能在函数中计算?

如下图所示,我们定义一个数组,分别在主函数,以及调用函数中计算数组的长度;

#include <stdio.h>
 int ROW(int arr[])
 {
     int ret;
     ret=sizeof(arr)/sizeof(arr[0]);
     return ret;
 }

int main()
{
    int arr[]={1,2,3,4,5,6};
    int i=sizeof(arr)/sizeof(arr[0]);
    int j =ROW(arr);
    printf("%d\n",i);
    printf("%d\n",j);
    return 0;
}

        结果为:

         在主函数中计算的数组长度没有问题,那为什么在调用函数中就有问题了呢?

        这是因为数组名作为参数,传递的只是首元素地址,并不是创建一个与实参一模一样大小的数组,在被调函数中,arr仅仅相当于一个指针变量,而直至变量的内存为8个字节,用它除以数字第一个元素的长度4个字节,这样剩下的数量只能是2;

指针变量的长度:

int main()
{
    int * a;
    int ret =sizeof(a);
    printf("%d\n",ret);
}

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值