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

编程入门 行业动态 更新时间:2024-10-13 22:21:58

一分钟搞清测<a href=https://www.elefans.com/category/jswz/34/1767165.html style=长度(sizeof和strlen)"/>

一分钟搞清测长度(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'结束,所以它的长度是6printf("%d\n", strlen(arr + 0));//此刻strlen内部不是单独放的数组名,arr+0表示arr[0]的地址,从首元素开始计算,所以它的长度是6printf("%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表示取出整个数组的地址,从首元素开始计算,所以它的长度是6printf("%d\n", strlen(&arr + 1));//此刻strlen内部不是单独放的数组名,&arr+1表示跳过整个数组的地址,所以它的值是随机值printf("%d\n", strlen(&arr[0] + 1));//此刻strlen内部不是单独放的数组名&arr[0]+1表示arr[1]的地址,所以它的长度是6return 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里面的地址,从首元素开始计算。它的长度是6printf("%d\n", strlen(p + 1));//此刻strlen内部p+1,表示跳过一个地址,从'b'开始计算,它的长度是5printf("%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,表示从第二个元素开始计算,它的长度是5return 0;
}

更多推荐

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

本文发布于:2024-02-06 13:55:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749275.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:长度   sizeof   strlen

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!