未来笔试重点(1)
创始人
2024-04-25 04:51:12

一起成为更优秀的人在这里插入图片描述

在这里插入图片描述

1.数组笔试重点考察

1.1整型数组与sizeof

1.2字符数组与sizeof

1.3sizeof与字符串

1.4strlen与字符串

2.指针笔试重点考察

2.1指针与sizeof

2.2指针与strlen

sizeof与整型数组

int a[] = { 1,2,3,4 };printf("%d\n",  sizeof(a));printf("%d\n",  sizeof(a+0));printf("%d\n",  sizeof(*a));printf("%d\n",  sizeof(a+1));printf("%d\n",  sizeof(a[1]));printf("%d\n",  sizeof(&a));printf("%d\n",  sizeof(*&a));printf("%d\n",  sizeof(&a+1));printf("%d\n",  sizeof(&a[0]));printf("%d\n",	sizeof(&a[0]+1));

必须要知道的两点:
必须要知道的两点:
必须要知道的两点:
(重要的事情说三遍)
数组名表示首元素地址!!!
除了这两个例外:
1.sizeof(数组名) – 数组名放在sizeof里面,数组名表示的是整个数组
2.&数组名 – 数组名表示的是整个数组:

1)
sizeof数组名-计算的是数组的总大小,单位字节:44=16
2)
由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+0还是首元素地址
是地址,大小就是4/8个字节 (看平台)
3)
由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a找到了首元素
是一个int类型的整数,是4字节
4)
由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+1表示第二个元素的地址,是地址就是4/8个字节
5)
a[1] == (a+1) ,由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,
a+1表示第二个元素地址,
解引用操作,找到第二个元素,所以是4个字节
6)
&a,a表示整个数组,&a取到了数组的地址,是地址,就是4/8个字节
7)
&a ,&a取到了数组的地址,再
解引用操作,找到了这个数组,相当于*&抵消了,所以
就是 a,单独放在sizeof内部,表示整个数组,大小是16字节
8)
&a+1,&a表示数组的地址,+1还是地址,只是跳过了一个数组,是地址,就是4/8个字节
9)
&a[0] == &*(a+0), &可以抵消,所以等于 (a+0)+1,由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+0+1就是第二个元素地址,是地址,就是4/8个字节
10)
&a[0] +1 == &
(a+0) +1,前面说过,&*可以抵消 就等于 (a+0)+1,a没有单独放在sizeof内部,所以a表示数组首元素地址,再+1,表示第二个元素地址,是地址,就是4/8个字节

我的环境是32位平台下:

在这里插入图片描述

sizeof与字符数组

char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr + 0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr + 1));printf("%d\n", sizeof(&arr[0] + 1));

1)
arr单独放在sizeof内部,计算数组大小,6*1=6字节
2)
arr不再单独放在sizeof内部,arr表示数组首元素地址
+0还是地址,是地址,就是4/8字节
3)
arr表示首元素地址,*arr找到了首元素
即 字符a,大小是1字节
4)
arr[1] == (arr+1) ,首元素地址+1再解引用,
找到了第二个元素,大小是1字节
5)
&arr,arr表示整个数组,&arr取到了数组的地址,是地址,就是4/8个字节
6)
&arr+1,还是地址,只不过+1跳过了一个数组,是地址,就是4/8字节
7)
&arr[0]+1 == &
(arr+0) +1,&*可以抵消,就等于arr+0+1,arr表示数组首元素地址,+1是第二个元素地址,是地址,就4/8个字节

结果如下:

在这里插入图片描述

sizeof与字符串

char arr[] = "abcdef"; printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr+0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr+1));printf("%d\n", sizeof(&arr[0] + 1));

这是一个数组,放了一串字符串,后面有\0
1)
arr单独放在sizeof内部,表示数组整个数组,由于存在一个\0
大小是7个字节
2)
arr不再单独放在sizeof内部,arr表示数组首元素地址,是地址就是4/8字节
3)
此时arr表示数组首元素地址,*arr,找到了首元素,大小是1字节
4)
arr[1] == *(arr+1),arr表示首元素地址,+1是第二个元素地址,操作后,找到了第二个元素,大小1字节
5)
&arr,arr表示整个数组,&arr取到了数组的地址,是地址就是4/8字节
6)
,+1后还是地址,只是跳过了一个数组,是地址就是4/8字节
7)
&arr[0]+1,==&
(arr+0)+1,&*抵消了,==arr+0+1,表示第二个元素的地址,是地址就是4/8字节

在这里插入图片描述

strlen与字符串

char arr[] = "abcdef";printf("%d\n", strlen(arr));printf("%d\n", strlen(arr+0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));

首先清楚strlen函数的参数是 const char* arr,传递的是一个地址
strlen会顺着这个地址往下找,直到找到 \0 为止,返回的是字符串的长度

1)
arr不并不是再sizeof内部,也不是&arr,所以arr表示数组首元素地址,即 "abcdef"中 a 的地址,strlen会顺着地址往下找,找到\0为止,并且不算\0,即返回6

2)
arr+0等价于arr,返回6
3)
arr表示首元素地址,*arr找到了首元素,即字符a,
'a’对应的ascii码值是97,意味着将97作为strlen 的地址,strlen会顺着97找下去,这是一个
错误的代码,所以程序会崩溃
在这里插入图片描述
如上图:
4)
与 3)相同,找到字符b,程序会崩溃
5)
这里会有一个警告:原因:arr是数组,数组的地址应该用数组指针来接收: char(p)[7] = &arr;
但是strlen的参数是:strlen(const char
arr);
参数不同,故报错,但不影响strlen的计算结果,为6
6)
&arr取到字符串的地址,+1跳过了一个字符串,
在这里插入图片描述
至于后面是什么,我们不得而知,也不知道strlen何时读取到\0,所以这里输出随机值

7)
&arr[0]+1 == &*(arr+0) +1,&*抵消了,==arr+0+1,
即找到了第二个元素的地址,也就是字符b的地址,从b开始往后数,答案就是5

结果如下:
在这里插入图片描述

指针和sizeof

	char* p = "abcdef";p是一个指针,指针存放的是地址,放不了一个字符串长度,只能存放a的地址printf("%d\n", sizeof(p));printf("%d\n", sizeof(p+1));printf("%d\n", sizeof(*p));printf("%d\n", sizeof(p[0]));printf("%d\n", sizeof(&p));printf("%d\n", sizeof(&p+1));printf("%d\n", sizeof(&p[0]+1));

1)
p是一个指针,存放的是a的地址,是地址就是4/8字节

2)
p+1就是指向了第二个字符的地址,即b的地址,4/8
3)
p放的是a的地址,p找到了a,即p==a,就是1字节
4)
p[0] == (p+0) ,1字节
5)
&p,取到的是p的地址(不是字符串abcdef的地址)
是地址,就是4/8字节
6)
&p+1,跳过了一个指针p,还是地址,就是4/8字节
7)
&p[0]+1,等价于&
(p+0)+1,&*抵消了,等价于p+0+1,即b的地址,是地址,就是4/8字节

结果如下:
在这里插入图片描述

指针和strlen

char* p = "abcdef";printf("%d\n", strlen(p));printf("%d\n", strlen(p+1));//5printf("%d\n", strlen(*p));//errorprintf("%d\n", strlen(p[0]));//errprintf("%d\n", strlen(&p));printf("%d\n", strlen(&p+1));//随机值printf("%d\n", strlen(&p[0] + 1));

1)
p是char指针,存放的是a的地址,将该地址传递给strlen,strlen会顺着a的地址往后找,直到找到\0为止,所以长度是6字节
2)
p+1找到b的地址,strlen从该地址处往后找,结果是5
3)
p指向a的地址,p找到了a,把a作为strlen的地址,a的ascii码值是97,即将97作为strlen 的地址,是错误的
4)
p[0]==
(p+0),一样是错误的
5)
,&p,取到的是p的地址,注意是p的地址,不是a的地址,p的地址无法确定,所以是一个随机值
6)
同5),&p+1只是向前移动了1,但地址仍然是未知的
7)
&p[0]+1 == &
(p+0) +1,&*可以抵消,== p+0+1,即找到了b的地址,所以答案是5

结果如下:
在这里插入图片描述

关注我,持续为你输出高质量博文
在这里插入图片描述

相关内容

热门资讯

tag是什么意思 tab是什么... 一、B端基础控件的认识控件一词,直译的话可以翻译成 “用来控制的元件”,是我们对 B 端系统进行信息...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
舌头对应五脏图 舌诊顺口溜 舌诊是非常重要的一门中医技术;更妙的是,舌诊适合普通人学习。因此从今天开始,会给大家简单介绍一些看舌...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...