当前位置:网站首页>详解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根据类型分析,并不会访问第四行的内容
结语
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
边栏推荐
猜你喜欢
JS common basic case sorting (continuous update)
图像处理8-CNN图像分类
C#课程设计之学生教务管理系统
the installer has encountered an unexpected error installing this package
Unity change default editor
Youyou1 of xlua knapsack system
Unity performance optimization
Base64和Base64URL
Mall management system of database application technology course design
[set theory] order relation (the relation between elements of partial order set | comparable | strictly less than | covering | Haas diagram)
随机推荐
Haproxy+kept cluster setup 02
Three characteristics
Golang 字符串分割,替换和截取
Zohocrm deluge function application time verification
Delete the last character of the string in golang
数据分析练习题
Initial unity
idea取消引用顯示效果
KunlunBase MeetUP 等您来!
Transplantation of tslib Library
P1896 [SCOI2005] 互不侵犯(状压dp)
Getting started with minicom
Clion toolchains are not configured configure disable profile problem solving
Encoding and decoding of golang URL
Golang 中string和int类型相互转换
Go resolve ID card
E: 无法定位软件包 ros-melodic-desktop-full
Abstract classes and interfaces
使用 FileChannel 进行文件的复制拷贝
数据库应用技术课程设计之商城管理系统