一分钟搞清测长度(sizeof和strlen)

首先我们得知道将数组名的特性:

1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。

4.strlen遇到‘\0’结束,sizeof测长度包括‘\0’

下面展示的都是x86环境


假设现在有一个一维数组  int a[ ] = {1,2,3,4};

让你对下面的进行分析。现在就让小阿永陪大家一起来分析一下他们的含义

#include<stdio.h>
int main()
{
    int a[] = { 1,2,3,4 };
    printf("%d\n", sizeof(a));
    //此刻sizeof内部单独放一个数组名,表示求整个数组的大小。每个元素类型是int占四个字节,有四个元素,总共占16个字节
    printf("%d\n", sizeof(a + 0));
    //此刻sizeof内部放的不止数组名。那它的含义就是首地址+移动元素个数,相当于a[0]。所以它测首元素内容的大小,及1的大小,
    //因为元素是整形,所以它是四个字节
    printf("%d\n", sizeof(*a));
    //此刻sizeof内部放的不止数组名。那它的含义是对首元素内容解引用。得到是元素 1 。因为它的类型是整形,所以也是占四个字节
    printf("%d\n", sizeof(a + 1));
    //此刻sizeof内部放的不止数组名。那它的含义是首元素+移动元素个数,相当于a[1],a[1]的元素是2,也是整形,所以占四个字节
    printf("%d\n", sizeof(a[1]));
    //此刻sizeof内部放的不止数组名。那它的含义下标为1的元素2.元素是整形,所以也是占四个字节
    printf("%d\n", sizeof(&a));
    //此刻sizeof内部放的不止数组名。那它的含义是取出整个数组的地址,32位机器下是占四个字节,64位机器是占8个字节
    printf("%d\n", sizeof(*&a));
    //此刻sizeof内部放的不止数组名。那它的含义先取地址再解引用,一抵消。sizeof内部放的相当于数组名,表示求整个数组的大小,
    //每个元素类型是int占四个字节,有四个元素,总共占16个字节
    printf("%d\n", sizeof(&a + 1));
    //此刻sizeof内部放的不止数组名。那它的含义取出整个数组的地址,然后+1表示跳过整个数组地址。但最后还是测地址。它占4个字节
    printf("%d\n", sizeof(&a[0]));
    //此刻sizeof内部放的不止数组名。那它的含义取出首元素的地址,还是测地址,它占四个字节
    printf("%d\n", sizeof(&a[0] + 1));
    //此刻sizeof内部放的不止数组名。那它的含义取出首元素地址,+1表示跳过一个元素地址指向下个元素地址及a[1]的地址,测地址还是占四个字节
    return 0;
}

再来一组字符数组检测一下我们的掌握程度: char arr[] = { 'a','b','c','d','e','f' };

#include<stdio.h>
int main()
{
    //字符数组
    char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));
    //此刻sizeof内部放的数组名。那它的含义测数组内容的长度,占6个字节
    printf("%d\n", sizeof(arr + 0));
    //此刻sizeof内部放的不止数组名。arr+0表示首元素的地址,测地址占四个字节
    printf("%d\n", sizeof(*arr));
    //此刻sizeof内部放的不止数组名。*arr表示对首元素地址解引用,计算的是第一个元素的大小,占一个字节
    printf("%d\n", sizeof(arr[1]));
    //此刻sizeof内部放的不止数组名。arr【1】表示下标为1的元素的大小,也是占一个字节
    printf("%d\n", sizeof(&arr));
    //此刻sizeof内部放的不止数组名。&arr表示取出整个数组的地址,测地址也是4个字节
    printf("%d\n", sizeof(&arr + 1));
    //此刻sizeof内部放的不止数组名。&arr+1表示取出跳过个数组的地址,也是地址,占四个字节
    printf("%d\n", sizeof(&arr[0] + 1));
    //此刻sizeof内部放的不止数组名。&arr[0]+1表示跳过首元素的地址。还是地址,所以占四个字节
    printf("%d\n", strlen(arr));
    //此刻strlen内部放的不止数组名。这儿注意是放在strlen里。是从首元素开始计算,遇到'\0'结束,这儿没有'\0'是随机值
    printf("%d\n", strlen(arr + 0));
    //此刻strlen内部放的不止数组名。arr+0表示首元素地址,从首元素开始计算,遇到'\0'结束,这儿没有'\0'是随机值
   printf("%d\n", strlen(*arr));
    //此刻strlen内部放的不止数组名。*arr表示对首元素解引用,把'a'的ASCII的值当做地址,这儿会访问错误
   printf("%d\n", strlen(arr[1]));
    //此刻strlen内部放的不止数组名。 arr[1]表示下标为1的元素,把'b'的ASCII的值当做地址,这儿会访问错误
    printf("%d\n", strlen(&arr));
    //此刻strlen内部放的不止数组名。这儿注意是放在strlen里。是从首元素开始计算,遇到'\0'结束,这儿没有'\0'是随机值
    return 0;
}

看到这可不敢迷糊,下面这种字符窜数组才是容易出错

#include<stdio.h>
int main()
{
    char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));
    //嘿嘿这儿易错,此刻sizeof内部单独放的数组名,表示测整个数组的长度,而字符窜其实还包含一个'\0',所以这儿是占7个字节
    printf("%d\n", sizeof(arr + 0));
    //此刻sizeof内部不是单独放的数组名,arr+0表示首元素地址,测地址,所以这儿占4个字节
    printf("%d\n", sizeof(*arr));
    //此刻sizeof内部不是单独放的数组名,*arr表示对首元素地址解引用,计算的是'a',它类型是char,所以占一个字节
    printf("%d\n", sizeof(arr[1]));
    //此刻sizeof内部不是单独放的数组名,arr[1]表示下标为1的元素'b',所以它也是占一个字节。
    printf("%d\n", sizeof(&arr));
    //此刻sizeof内部不是单独放的数组名,&arr表示取出整个数组的地址,测地址所以它是占4个字节
    printf("%d\n", sizeof(&arr + 1));
    //此刻sizeof内部不是单独放的数组名&arr+1表示跳过整个数组的地址,还是测地址,所以它也是占4个字节
    printf("%d\n", sizeof(&arr[0] + 1));
    //此刻sizeof内部不是单独放的数组名,&arr[0]+1表示arr[1]的地址,测地址所以它是占四个字节
    printf("%d\n", strlen(arr));
    //此刻strlen内部是单独放的数组名,表示从首元素开始计算,遇到'\0'结束,所以它的长度是6
    printf("%d\n", strlen(arr + 0));
    //此刻strlen内部不是单独放的数组名,arr+0表示arr[0]的地址,从首元素开始计算,所以它的长度是6
    printf("%d\n", strlen(*arr));
    //此刻strlen内部不是单独放的数组名,*arr表示对首元素地址解引用,是'a'的ASCII的值,这儿会报错
    printf("%d\n", strlen(arr[1]));
    //此刻strlen内部不是单独放的数组名,arr[1]表示下标为1的元素'b',是'b'的ASCII的值,这儿会报错
    printf("%d\n", strlen(&arr));
    //此刻strlen内部不是单独放的数组名,&地址arr表示取出整个数组的地址,从首元素开始计算,所以它的长度是6
    printf("%d\n", strlen(&arr + 1));
    //此刻strlen内部不是单独放的数组名,&arr+1表示跳过整个数组的地址,所以它的值是随机值
    printf("%d\n", strlen(&arr[0] + 1));
    //此刻strlen内部不是单独放的数组名&arr[0]+1表示arr[1]的地址,所以它的长度是6
    return 0;
}

接着我们看看把字符窜放进指针会是怎么样的呢:

#include<stdio.h>
int main()
{
    char* p = "abcdef";
    printf("%d\n", sizeof(p));
    //此刻sizeof内部是指针变量,测的是地址,它占4个字节
    printf("%d\n", sizeof(p + 1));
    //此刻sizeof内部是p+1,它表示地址加1还是地址,它占四个字节
    printf("%d\n", sizeof(*p));
    //此刻sizeof内部是*p,解引用访问一个字节,计算的是首元素的大小,它占一个字节
    printf("%d\n", sizeof(p[0]));
    //此刻sizeof内部p[0],表示首元素的大小,它占一个字节
    printf("%d\n", sizeof(&p));
    //此刻sizeof内部是&p,计算的是地址,所以它占4个字节
    printf("%d\n", sizeof(&p + 1));
    //此刻sizeof内部是&p+1,计算的还是地址,所以它占4个字节
    printf("%d\n", sizeof(&p[0] + 1));
    //此刻sizeof内部是&p[0]+1,表示跳过一个字节找到p[1]的地址,它占4个字节
    printf("%d\n", strlen(p));
    //此刻strlen内部是p,表示p里面的地址,从首元素开始计算。它的长度是6
    printf("%d\n", strlen(p + 1));
    //此刻strlen内部p+1,表示跳过一个地址,从'b'开始计算,它的长度是5
    printf("%d\n", strlen(*p));
    //此刻strlen内部*p对p解引用得到'a'的ASCII的值,这儿会报错
    printf("%d\n", strlen(p[0]));
    //此刻strlen内部是p[0]表示'a'的ASCII的值,这儿会报错
    printf("%d\n", strlen(&p));
    //此刻strlen内部是&p,这儿是随机值
    printf("%d\n", strlen(&p + 1));
    //此刻strlen内部是&p+1表示跳过指针p 的地址。这儿也是随机值
    printf("%d\n", strlen(&p[0] + 1));
    //此刻strlen内部&p[0]+1,表示从第二个元素开始计算,它的长度是5
    return 0;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值