栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

详解sizeof、strlen、指针和数组等组合题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解sizeof、strlen、指针和数组等组合题

   本部分属于C语言高级玩法   


目录 本部分属于指针、数组、sizeof和strlen组合在一起的高级玩法,助你轻松拿下! 1.坑点总结 2.题目解析


坑点总结

1. sizeof  

①sizeof(数组名);这里的数组名表示整个数组,而不是整个数组的地址

②sizeof 是操作符,计算变量的类型所占内存空间的大小,单位是字节,不关注内存中存放的内容

③sizeof是根据类型分析,不会访问具体内容

④printf("%dn",sizeof(指针)),得到的大小是4个字节(在x86环境下)或8个字节(在x64环境下)

2. strlen  

①strlen 是库函数,使用时需要引头文件,专门求字符串长度,只能针对字符串,向后一直找,统计之前的字符个数 

②strlen()只可以接收地址,strlen('a')或strlen(97),属于非法访问,是个野指针!


题目解析

以下题目包含了对数组名的理解、指针的运算和指针类型的意义等非常重要的知识点,


//一维数组

 重点总结:

①sizeof()只关注括号中的类型,不关注其内容

②sizeof(指针)则答案为4个字节或者8个字节

int a[ ] = {1,2,3,4};


printf("%dn",sizeof(a));得16

printf("%dn",sizeof(a+0));得4或8

printf("%dn",sizeof(*a));得4

printf("%dn",sizeof(a+1));得4或8

printf("%dn",sizeof(a[1]));得4

printf("%dn",sizeof(&a));得4或8

printf("%dn",sizeof(*&a));得16

printf("%dn",sizeof(&a+1));得4或8

printf("%dn",sizeof(&a[0]));得4或8

printf("%dn",sizeof(&a[0]+1));得4或8


//字符数组

 重点总结:

 ①strlen()的括号中只能存放地址,并沿着这个地址一直向后寻找

②字符指针存放的是第一个字符的地址,和这个指针的地址不是同一个地址

char arr[ ] = {'a','b','c','d','e','f'};


printf("%dn", sizeof(arr));得6

printf("%dn", sizeof(arr+0));得4或8

printf("%dn", sizeof(*arr));得1

printf("%dn", sizeof(arr[1]));得1

printf("%dn", sizeof(&arr));得4或8

printf("%dn", sizeof(&arr+1));得4或8

printf("%dn", sizeof(&arr[0]+1));得4或8

printf("%dn", strlen(arr));得随机值

printf("%dn", strlen(arr+0));得随机值

printf("%dn", strlen(*arr));得error

printf("%dn", strlen(arr[1]));得error

printf("%dn", strlen(&arr));得随机值

printf("%dn", strlen(&arr+1));得随机值-6

printf("%dn", strlen(&arr[0]+1));得随机值-1

char arr[ ] = "abcdef";


printf("%dn", sizeof(arr));得7

printf("%dn", sizeof(arr+0));得4或8

printf("%dn", sizeof(*arr));得1

printf("%dn", sizeof(arr[1]));得1

printf("%dn", sizeof(&arr));得4或8

printf("%dn", sizeof(&arr+1));得4或8

printf("%dn", sizeof(&arr[0]+1));得4或8

printf("%dn", strlen(arr));得6

printf("%dn", strlen(arr+0));得6

printf("%dn", strlen(*arr));得error

printf("%dn", strlen(arr[1]));得error

printf("%dn", strlen(&arr));得6

printf("%dn", strlen(&arr+1));得随机值

printf("%dn", strlen(&arr[0]+1));得5

char *p = "abcdef";


printf("%dn", sizeof(p));得4或8

printf("%dn", sizeof(p+1));得4或8

printf("%dn", sizeof(*p));得1

printf("%dn", sizeof(p[0]));得1

printf("%dn", sizeof(&p));得4或8

printf("%dn", sizeof(&p+1));得4或8

printf("%dn", sizeof(&p[0]+1));得4或8

printf("%dn", strlen(p));得6

printf("%dn", strlen(p+1));得5

printf("%dn", strlen(*p));得error

printf("%dn", strlen(p[0]));得error

printf("%dn", strlen(&p));得随机值

printf("%dn", strlen(&p+1));得随机值

printf("%dn", strlen(&p[0]+1));得5


//二维数组

重点总结:

①一个二维数组arr[3][4],arr[0]表示第一行的地址,arr[1]表示第二行的地址,arr[2]表示第三行的地址

②sizeof('a'+1),会发生整型提升

 

int a[3][4] = {0};


printf("%dn",sizeof(a));得48

printf("%dn",sizeof(a[0][0]));得4

printf("%dn",sizeof(a[0]));得16

printf("%dn",sizeof(a[0]+1));得4或8

特别注意:本题中a[0]表示第一行第一个元素的地址,+1则为第一行第二个元素的地址

printf("%dn",sizeof(*(a[0]+1)));得4

printf("%dn",sizeof(a+1));得4或8

特别注意:本题中a表示该二维数组第一行的地址,+1则为该二维数组第二行的地址

printf("%dn",sizeof(*(a+1)));得16

printf("%dn",sizeof(&a[0]+1));得4或8

特别注意:本题中&a[0]表示该二维数组第一行的地址,+1为该二维数组第二行的地址

printf("%dn",sizeof(*(&a[0]+1)));得16

printf("%dn",sizeof(*a));得16

特别注意:本题中a表示第一行元素的地址,解引用后为二维数组的第一行

printf("%dn",sizeof(a[3]));得16

特别注意:尽管a[3]属于越界访问,但是sizeof计算变量的类型所占内存空间的大小,sizeof根据类型分析,并不会访问第四行的内容


结语

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1000692.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号