当前位置:网站首页>详解sizeof、strlen、指针和数组等组合题
详解sizeof、strlen、指针和数组等组合题
2022-07-03 08:15:00 【珠江上上上】
本部分属于C语言高级玩法
目录
本部分属于指针、数组、sizeof和strlen组合在一起的高级玩法,助你轻松拿下!
1.坑点总结
2.题目解析
坑点总结
1. sizeof
①sizeof(数组名);这里的数组名表示整个数组,而不是整个数组的地址
②sizeof 是操作符,计算变量的类型所占内存空间的大小,单位是字节,不关注内存中存放的内容
③sizeof是根据类型分析,不会访问具体内容
④printf("%d\n",sizeof(指针)),得到的大小是4个字节(在x86环境下)或8个字节(在x64环境下)
2. strlen
①strlen 是库函数,使用时需要引头文件<string.h>,专门求字符串长度,只能针对字符串,向后一直找\0,统计\0之前的字符个数
②strlen()只可以接收地址,strlen('a')或strlen(97),属于非法访问,是个野指针!
题目解析
以下题目包含了对数组名的理解、指针的运算和指针类型的意义等非常重要的知识点,
//一维数组
重点总结:
①sizeof()只关注括号中的类型,不关注其内容
②sizeof(指针)则答案为4个字节或者8个字节
int a[ ] = {1,2,3,4};
printf("%d\n",sizeof(a));得16
printf("%d\n",sizeof(a+0));得4或8
printf("%d\n",sizeof(*a));得4
printf("%d\n",sizeof(a+1));得4或8
printf("%d\n",sizeof(a[1]));得4
printf("%d\n",sizeof(&a));得4或8
printf("%d\n",sizeof(*&a));得16
printf("%d\n",sizeof(&a+1));得4或8
printf("%d\n",sizeof(&a[0]));得4或8
printf("%d\n",sizeof(&a[0]+1));得4或8
//字符数组
重点总结:
①strlen()的括号中只能存放地址,并沿着这个地址一直向后寻找 \0
②字符指针存放的是第一个字符的地址,和这个指针的地址不是同一个地址
char arr[ ] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));得6
printf("%d\n", sizeof(arr+0));得4或8
printf("%d\n", sizeof(*arr));得1
printf("%d\n", sizeof(arr[1]));得1
printf("%d\n", sizeof(&arr));得4或8
printf("%d\n", sizeof(&arr+1));得4或8
printf("%d\n", sizeof(&arr[0]+1));得4或8
printf("%d\n", strlen(arr));得随机值
printf("%d\n", strlen(arr+0));得随机值
printf("%d\n", strlen(*arr));得error
printf("%d\n", strlen(arr[1]));得error
printf("%d\n", strlen(&arr));得随机值
printf("%d\n", strlen(&arr+1));得随机值-6
printf("%d\n", strlen(&arr[0]+1));得随机值-1
char arr[ ] = "abcdef";
printf("%d\n", sizeof(arr));得7
printf("%d\n", sizeof(arr+0));得4或8
printf("%d\n", sizeof(*arr));得1
printf("%d\n", sizeof(arr[1]));得1
printf("%d\n", sizeof(&arr));得4或8
printf("%d\n", sizeof(&arr+1));得4或8
printf("%d\n", sizeof(&arr[0]+1));得4或8
printf("%d\n", strlen(arr));得6
printf("%d\n", strlen(arr+0));得6
printf("%d\n", strlen(*arr));得error
printf("%d\n", strlen(arr[1]));得error
printf("%d\n", strlen(&arr));得6
printf("%d\n", strlen(&arr+1));得随机值
printf("%d\n", strlen(&arr[0]+1));得5
char *p = "abcdef";
printf("%d\n", sizeof(p));得4或8
printf("%d\n", sizeof(p+1));得4或8
printf("%d\n", sizeof(*p));得1
printf("%d\n", sizeof(p[0]));得1
printf("%d\n", sizeof(&p));得4或8
printf("%d\n", sizeof(&p+1));得4或8
printf("%d\n", sizeof(&p[0]+1));得4或8
printf("%d\n", strlen(p));得6
printf("%d\n", strlen(p+1));得5
printf("%d\n", strlen(*p));得error
printf("%d\n", strlen(p[0]));得error
printf("%d\n", strlen(&p));得随机值
printf("%d\n", strlen(&p+1));得随机值
printf("%d\n", strlen(&p[0]+1));得5
//二维数组
重点总结:
①一个二维数组arr[3][4],arr[0]表示第一行的地址,arr[1]表示第二行的地址,arr[2]表示第三行的地址
②sizeof('a'+1),会发生整型提升
int a[3][4] = {0};
printf("%d\n",sizeof(a));得48
printf("%d\n",sizeof(a[0][0]));得4
printf("%d\n",sizeof(a[0]));得16
printf("%d\n",sizeof(a[0]+1));得4或8
特别注意:本题中a[0]表示第一行第一个元素的地址,+1则为第一行第二个元素的地址
printf("%d\n",sizeof(*(a[0]+1)));得4
printf("%d\n",sizeof(a+1));得4或8
特别注意:本题中a表示该二维数组第一行的地址,+1则为该二维数组第二行的地址
printf("%d\n",sizeof(*(a+1)));得16
printf("%d\n",sizeof(&a[0]+1));得4或8
特别注意:本题中&a[0]表示该二维数组第一行的地址,+1为该二维数组第二行的地址
printf("%d\n",sizeof(*(&a[0]+1)));得16
printf("%d\n",sizeof(*a));得16
特别注意:本题中a表示第一行元素的地址,解引用后为二维数组的第一行
printf("%d\n",sizeof(a[3]));得16
特别注意:尽管a[3]属于越界访问,但是sizeof计算变量的类型所占内存空间的大小,sizeof根据类型分析,并不会访问第四行的内容
结语
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
边栏推荐
- freetype库的移植
- [USACO12MAR]Cows in a Skyscraper G(状态压缩dp)
- 十六进制编码简介
- Puhua PLM empowers the whole scene product lifecycle management and helps the enterprise digital transformation of the main line of products
- [global product discovery 2] the first pure cloud augmented reality (AR) platform - Israel
- Shader foundation 01
- tslib库的移植
- My touch screen production "brief history" 1
- [set theory] order relation (the relation between elements of partial order set | comparable | strictly less than | covering | Haas diagram)
- Basic operation and process control
猜你喜欢
Docker installs MySQL and successfully uses Navicat connection
Dotween plug-in
VMware virtual machine configuration static IP
My touch screen production "brief history" 1
数据库应用技术课程设计之商城管理系统
C language - Introduction - essence Edition - take you into programming (I)
the installer has encountered an unexpected error installing this package
C#课程设计之员工信息管理系统
MAE
Base64和Base64URL
随机推荐
方正锐利重磅升级到12.0版本,包装印前处理更加便捷、高效!
[set theory] order relation (hastu example | divisive relation hastu | inclusive relation hastu | refinement relation hastu)
P1596 [USACO10OCT]Lake Counting S
璞华PLM为全场景产品生命周期管理赋能,助力产品主线的企业数字化转型
Delete the last character of the string in golang
数据的存储
Base64和Base64URL
数据库应用技术课程设计之商城管理系统
What is BFC?
Golang 时间格式整理
VMware virtual machine configuration static IP
[cocos creator] get the resource UUID
JSON与Object之间转换
haproxy+keepalived集群搭建02
Golang's range
The general trend of data news releases the power of visual reporting ----- essays after reading
P2704 [NOI2001] 炮兵阵地(状压dp)
Storage of data
Xlua task list youyou
Abstract classes and interfaces