C博客作业05--2019-指针
0.展示PTA总分(0----2)
1.本章学习总结(2分)
1.1 学习内容总结:
- 学习了本章内容,首先要明确的是要知道什么是指针变量,按照百度百科的释义:指针变量是指存放地址的变量。因地址的改变而做出指定性质的衡量变法。这明确了指针变量的含义,它表示的不是一个值,而是一个地址,所以对指针变量进行赋值时就要注意赋值地址而不是值。
- 既然指针变量是存放地址的,然而正常使用是不会去纠结地址,那么为什么要指针变量???其实指针变量前加上*号就代表地址上的值,那为何不直接用变量而是用指针变量然后再指向变量呢??这就要提到指针的好处了:a.为函数提供修改调用变元的灵活手段;b.支持C 动态分配子程序c.可以改善某些子程序的效率>>在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。d.为动态数据结构(如二叉树、链表)提供支持(好处摘自luckyone906的博客)。
- 指针的定义:
类型 *变量名
其中号必不可少,如果没有就是一般的变量;变量名的选择建议如果指向之前定义的变量可以在之前的变量名前加p作为那个变量的指针变量。 - 指针的赋值:
如果是指向变量的指针,在赋值时注意指向地址,如:
int num;
int *pnum;
pnum=#
如果时指向变量数组,则直接赋值,如:
int num[10];
int *pnum;
pnum=num;
此时指针pnum是num[0]的地址 - 指针做循环变量的做法:
指针做循环变量时可以定义另一个来循环,这样原指针的地址就不变,在一些情景也可以直接作为循环变量
PTA指针6-6 查找子串中我就将指针用于循环变量。
- 字符指针如何表示字符串:
1.在定义指针时对其进行初始化为一个字符串:
char *s="Hello World";
2.将一个数组的首地址赋值给指针变量并对整个数组进行输出:
char s[11];
char *p;
scanf("%s",&s);
输入hello world\n
p=s;
for(i=0;i<11;i++)
printf("%c",*(p+i));
- 动态内存分配:
一般就是使用malloc函数和calloc函数申请动态内存,使用完之后要使用free函数释放掉申请得来的空间。例如:
PTA指针6-8 计算最长的字符串长度的题干。
- 指针数组及其应用:
如果数组的各个元素都是指针类型,用于存放内存地址,那么这个数组就是指针数组。指针数组定义的一般格式为:类型名 *数组名[数组长度]。例如
char *ps[10];
char s[10][10];
for(i=0;i<10;i++)
ps[i]=s[i];
- 二级指针、行指针
指向指针的指针称为二级指针,一般定义形式为:类型名 **变量名,例如:
int **ppnum;
行指针是指向数组的指针,例如:
int (*pnum)[10];
- 函数返回值为指针:
函数的返回值类型自然也可以是指针类型,即函数可以返回一个地址。但需要注意的是不能返回在函数内部定义的局部数据对象的地址,这些地址在函数结束时会被自动回收,从而导致返回的地址无效,因此返回指针的函数一般都返回全局数据对象的或者主调函数中数据对象的地址,例如:
PTA指针6-6 查找子串,题目要求的函数就是返回值为指针的函数。
1.2 本章学习体会:
- 学了大半个学期,也有做过一次大作业,深刻感到自己的懒惰,也发现了预习复习的重要,不懂的也慢慢学会去问同学。
- 计算这两周代码量
题集 | 2019-c10-指针 |
---|---|
代码量 | 352 |
2.PTA实验作业(7分)
2.1 6-2 jmu-c-二分查找
2.1.1 伪代码:
定义最小min
定义最大max并赋值为n-1
定义中间数mid
定义整型变量用于判断是否找到
while循环
令mid等于中间值
if判断等于则将count累加并将mid赋值给loc并退出
if判断大于并将最小min移动到mid右方并将count累加
if判断小于并将最大max移动到mid左方并将count累加
end while
return loc
2.1.2 代码截图:
2.1.3 总结本题的知识点:
- 本题主要是二分法的应用,主要要记住循环的条件的选择与下标的移动。
- 还有count的累加是用
(*count)++
而不是*count++
这涉及到运算符的优先级,由于后缀递加与指针的运算优先级相同,从而服从从右到左的原则,如果是后一种则是count地址的递加而不是count的值的递加。 - 还有定义变量时赋初值的选择,本题中loc的定义并赋了初值-1,这是考虑了如果没找到返回题目要求的-1值。
2.1.4 PTA提交列表及说明
错误点 | 我的解决思路 |
---|---|
部分正确 | loc没有赋初值,导致第三个测试点:找不到 没过 |
答案正确 | 重新审视题目后,将loc的赋值赋了初值-1,答案正确 |
2.2 6-7 输出月份英文名
2.2.1 伪代码:
定义一个二维数组mon存储月份的英文名
函数名
定义指针变量month
对指针变量进行赋初值NULL为空指针,从而达到不符合也能够一次输出的目的
if判断是否是1-12月,如果不是将month返回,即返回空指针
如果没返回空指针则代表属于1-12月,将1-12月的数组的首地址赋值给month
返回month
2.2.2 代码截图:
2.2.3 总结本题知识点:
- 首先则是指针函数的编译及返回值为指针。
- 其次本题我用到了全局变量,即二维数组mon。
- 对指针赋值唯一可以直接赋值的空指针NULL。
2.2.4 PTA提交列表及说明:
错误点 | 我的解决思路 |
---|---|
部分正确 | 我用了二维数组,但定义在函数内,所有测试点就达成了后三个测试点 |
编译错误 | 我想着能否用指针数组,但却搞了个自己发明的指针二维数组*mon[12][10] |
答案正确 | 这次不敢直接在PTA提交,经过多次定义,试着将mon定义在函数外,发现这是个全局变量,并且答对了题目 |
2.3 7-1(指针做函数返回值) 查找指定字符
2.3.1 伪代码:
定义长度为82的字符数组ch
定义字符op用来存储要查询的字符
定义判断的变量flag并赋初值0
定义下标的变量index用于储存找到的下标
定义循环变量i
从键盘抓取要查找的字符op
getchar盛放回车符,防止对下一个变量的获取产生影响
fgets获得字符串
while循环
if判断是否找到,如果找到改变flag的值
对循环变量i进行累加
end while
if对flag进行判断输出的值
2.3.2 代码截图:
2.3.3 总结本题知识点:
- 对字符数组ch的定义是长度为82很关键,虽然题目要求不超过82个字母,但如果仅定义长度为82,则会发生段错误,即数组溢出。
- getchar存放回车也很重要,我有没存放回车的经历,但导致结果出错,在VS测试与题目给的输出结果有偏差。
- if判断是用于判断的flag也是常用的判断变量。
- fgets的使用在字符的题目中也是应用广泛。
2.3.4 PTA提交列表及说明:
错误点 | 我的解决思路 |
---|---|
部分正确 | 第一遍在VS测试将题目给的测试点达成后就提交到PTA,发现我的是最小下标,在if判断是找到我就直接break退出了 |
部分正确 | 在对上一次提交进行了修改后任然没有解决那个问题 |
答案正确 | 我多次修改多次调试后终于正确了(忘了当时怎么改的了) |
3 阅读代码:
我选择阅读的是力扣里面的一题报数:
我看的是一位名叫全网最秀的代码,因为看他介绍时说用递归吸引了我,毕竟刚学的递归:
由于能力限制只能截到这么多,最后一行时返回值就不截图了。
- 首先给我的第一感观就是他有用到注释,注释这一点是我的痛点,我写的代码很少有用到注释。
- 他对n=1进行了特殊处理,逻辑性很强。
- 可读性与逻辑性很强,看他定义,命名,注释,递归函数套用时代入的变量,都让人收益颇丰。
- 虽然说这题是字符串加上递归的知识点,但我真的是看的一头雾水,不是说作者的可读性与逻辑性的问题,相反,他的代码可读性和逻辑性很强,只是我掌握的知识点不够。
- 虽然我没有看懂这题代码,但选这题而没有因为没看懂去找其他题目阅读是想告诉自己,我现在看不懂,但只要通过努力学习,我迟早能看懂吃透。