这道题 C语言计算?

1)设某循环队列的容量为50,如果头指针front=45(指向队头元素的前一位置),尾指针rear=10(指向队尾元素),则该循环队列中共有 【】 个元素。
2)在一个容量为15的循环队列中,若头指针front=6,尾指针rear=9,则该循环队列中共有【】个元素

}

前言:本文章将带你刷8道比较有意思的指针笔试题,笔者将由深入浅出解析这些题目!必要的题目,作者已经加上内存布局图!希望本文对你有所帮助!



一.笔试题1 -指针与一维数组的关系-值

//a为数组名,首元素地址,即为1的地址,+1,跳过一个元素,即为2的地址

 二.笔试题2-指针与结构体

//这里告知结构体的大小是20个字节
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
 // 0x -> 0x 错误, 要将20转化为16进制再加,或者将16进制0x转化为10进制之后加上20,然后再转化为16进制
 //所以最终结果为:0x
 //所以结果为: 0x
 //将p强转为无符号整形,+1跳过一个整形->跳过4个字节
 
注意坑点:整数+1 ->跳过一个字节 执行普通的加减运算

指针+1 的步长取决于指针指向的数据的类型

 

三.笔试题3-指针与一维数组的关系-址

 

此时的a代表的首元素地址,地址值是一个常量,

整数+1:相当于跳过一个字节

所以应该画出数组的整体字节布局,注意要考虑小端存放读取时倒着读取的问题

ptr2是整形指针,解引用向后访问4个字节

要倒着拿:所以打印结果为:

 




 
 
坑点:逗号表达式-结果为最后一个表达式的结果

所以相当于只初始化了前三个元素,后面的元素未初始化,默认为0

a[0] : 二维数组第一行的数组名,在这里是首元素地址,即第一行第一个元素的地址

p是整形指针,解引用向后访问4个字节

 

 

五.笔试题5-指针与二维数组

 
注意:p是数组指针,指向的数组有4个元素
指针-指针得到的是二者之间的元素个数





 
 

整数在内存中以补码方式存储打印地址和打印无符号整数一样,都是打印内存中补码
使用%d方式打印:打印二进制补码对应的原码,=> -4

 
注意a是二维数组,对应数组指针的类型为:int(*)[5],指向的是有5个元素的一维数组
而p是数组指针,指向的数组只有4个元素,所以会有警告

 

六.笔试题6-指针与二维数组

 

&二维数组应该使用数组指针接收,现在保存到整形指针,所以要强转。

aa:没有单独放在sizeof内部,没有&数组名,所以代表的是二维数组首元素地址,即二维数组第一行的地址

 

 

七.笔试题7-指针与字符指针数组

 

a是数组,元素类型为:char* ,存放的是指向字符串的首字符地址

根据后面初始化的内容确定数组的大小

所以从字符a的地址向后打印,遇到\0即停止打印

 

 


 
这道题比较难,所以我们分表达式解决!

 


 

前置++,cpp先自增,


(存放了)指向存放c+2地址的空间(地址)


所以从首字符P开始向后打印,打印结果为:POINT

 

 

注意:上面的表达式,cpp发生自增,指向的已经是存放c+2地址的空间

++cpp :前置++,cpp发生自增原来是指向存放c+2地址的空间,变为指向存放c+1地址的空间


*++cpp:拿到存放c+1地址的空间,里面存放的是c+1的地址

--*++cpp;前置--,相当于自减解引用cpp之后的内容,即自减c+1的地址,(地址值是常量)。即把原来空间存放的是c+1的地址变成了存放的是c的地址,即现在拿到的是存放c地址的空间


*--*++cpp : 得到c空间中存放的内容(首字符E的地址)


从E的地址向后打印->打印结果为ER

 

 

cpp-2:从指向存放c地址空间又变为了指向存放c+3地址的空间

**(cpp-2):得到c+3空间的内容(首字符F的地址)


从S的地址向后打印,打印结果为:ST

 

 

 注意:此时的cpp指向为第二条表达式之后的状态,上面的第三条表达式并没有改变cpp(即cpp没有自增自减以及被赋值)也没有改变其指向内容所以第四条表达式的初始状态为计算第二条表达式之后的内存布局

*(cpp-1)-1 :c+2的地址值(常量)自减,变成了c+1的地址,即得到了c+1的地址

*(*(cpp-1)-1)+1:得到首字符N向后+1跳过一个字符,即为字符E的地址


从字符E向后打印,打印结果为EW

 

 

能坚持看完,你已经比别人优秀很多了!也感谢你看到最后,如果笔者哪里写错了的话,欢迎大佬们评论区指正!如果此文对你有帮助的话,欢迎留个关注,留个赞再走呀!
}

早在上周我就开始使用C#语言做,由于最后一点问题而放弃,之后用C语言开始做,很顺利,但是也碰到了一些问题,但是通过了百度文库上的一些程序的借鉴和吴阿平同学的悉心指导最后还是解决了,主要是通过C语言实现能够生成100以内的加减乘除题目,并且判断使用者的答题是否正确。一开始的时候先会给使用者提供加减乘除四个选项,使用者选择后会提示是一位数还是两位数;之后使用者开始作答,之后之前的步骤一直循环,直到使用者不再使用。下面是程序代码:

printf("欢迎进入小学四则运算题,现在考验你的智商是不是真正的“小学生”了!\n");

}

我要回帖

更多关于 c语言搜题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信