C博客作业05--2019-指针
1.本章学习总结
1.1 学习内容总结
1.1.1,指针定义:
int *p;
float *p;
char *p;直接对地址进行操作
指针被定义后,需先赋值后使用(指针赋初值时,只能赋给相同类型的指针)
不能用数值赋初值,但可以初始化为0,即NULL;
输出时可以用printf("%.*s",len,p)[len表示输出长度,p表示需要输出的地址]
1.1.2,指针作函数参数
swap(&a,&b);
void swap(char *aPstr,char *bPstr);
传入为地址,指针接收(可以传出多个数值)
1.1.3,数组作函数参数
int a[10];
Array(a);
void Array(int *p);
在使用时可以用数组形式,也可以用指针形式(即p[mid]可以写为*(p+mid))
1.1.4,字符指针
字符指针和字符数组都可以用来处理字符串,比如:
char sa[]="hello";
char *sp="hello";
字符数组占用的是一块连续的单元,而字符指针占用的是一个可以存放地址的内存单元
1.1.5动态分配
p=(int *)malloc(n*sizeof(int))
动态释放函数free(p)
malloc对分配的地方不做任何事,而calloc进行初始化
1.1.6指针数组,二级指针,行指针
一维指针数组定义:类型名 *数组名【数组长度】
二级指针:类型名* *变量名;
*变量名 代表的是地址,**变量名代表的是内容
二维数组用二级指针表示,可以用下标操作也能用指针操作:
*(a[i]+j)可以写成*(*(a+i)+j)
定义二维数组时必须指明列长度
输入多个字符串时,可以用动态分配来处理,每次输入时对每行动态分配空间
1.1.7 指针做函数返回值及其注意
char* search(char* s,char *p)
pos=search(s,p)
返回的需是地址
不能返回在函数内部定义的局部数据对象的地址
1.2 本章学习体会
1.在指针这章,我明显感觉到了指针的麻烦,每次在编译时,时不时的就有什么访问权限冲突,溢出呀之类的错误,确实比前面的内容要难一些,有时候最难的就是分不清到底我要定义的是一级指针还是二级指针,总的来说,学习了新的内容,掌握了新的知识,也是成长,也为之感到高兴;
2.代码量:本周500行代码
2.PTA实验作业
2.1 题目名1:本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。
2.1.1伪代码
函数定义
{
while遍历数组a
if前一个长度大于后一个长度
if判断是否大于最大长度
是则将len复值
else
判断后面的字符串长度是否大于len
大于则赋值给len
if判断只有一个字符时,直接返回字符长度
返回len的长度
}
2.1.2代码截图
2.1.3总结本题知识点
1:注意当字符串数量为1时,情况不一样,需分开讨论
if(n==1)
{
return strlen(s[0]);
}
2:strlen函数的用法,用来计算字符串的长度,需包含在string.h的头文件中,如果另写代码完成此功能会增加不必要的代码量
3.函数传入数组的做法
int max_len(char* s[], int n)
2.1.4PTA提交列表及说明
说明:
1.部分正确:直接考虑的前一的字符串是否大于len,不大于则直接比较下一个,没有考虑第二个字符串是否大于len
解决:在判断完第一次时,再判断第二个字符是否大于len
2.部分正确:没有考虑字符串长度为1的情况
解决:在结束循环后,判断n是否为1,为1直接返回长度
2.2题目名二:给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
2.2.1 伪代码
int main
{
fgets输入字符串;
定义整形数len,用来保存每个字符长度
定义一个指针Pstr指向str,防止改变了原来的地址
Pstr指到str末尾,从后往前扫描;
while遍历整个字符串
if判断是否为空格,不是则
if判断前一个为是否为空格
是则输出len个长度的字符串
判断开头是否为空格
为否,则输出最前面的len+1个长度的字符串
}
2.2.2 代码截图
2.2.3 总结本题的知识点
1.输出字符串时,可以用下面的方法输出,可以想输出多少就输出多少字符
printf(" %.*s", len + 1, Ptre);(len+1表示输出长度)(Pstr表示输出的字符串)
2.第一个字符不为空格时,需要另外讨论,因为前一个字符不存在
3.每次输出完时,要记得令len的长度为0
4.flag的灵活控制
5.怎么找字符串单词,即当前字符是非空格,而前一个字符是空格
if(*p!=' '&&*(p-1)==' ')
2.2.4 PTA提交列表及说明
说明:
部分正确:最后判断第一个字符时,直接输出,没有考虑是否只是一个单词的情况
解决:灵活运用到flag来判断他是否执行以上的循环
部分正确:在编译器上运行调试的时候,并没有加flag进去判断,输出的开头也是错误的
解决:加入flag判断是否为第一个字符来控制格式
答案错误:在编译器上运行时,最后if判断里len的长度没加1,导致程序在while里的len是指向第一个字符的,并没有加上它的长度
解决:len+1,把第一个字符也输出
2.3 题目名三:本题要求实现一个字符串查找的简单函数。
2.3.1 伪代码:
指针函数定义
{
定义两个新指针,指向传入的两个指针,不改变原来的地址
while遍历主串
while主串和子串相同时,同时往后移动
if判断子串是否结束,结束返回地址;没结束继续遍历,子串回原位
}
2.3.2 代码截图
2.3.3 总结本题知识点
1.指针作函数返回值,返回的必须是地址
char* search(char* s,char *p)
pos=search(s,p)
2.学习指针为空时的状态,返回空指针
3.子串指针回到起始位置时,主串不移动,continue的灵活运用
2.3.4 PTA提交列表及说明
说明:(虽然在PTA是一次就过,但在vs上遇到了一些错误)
部分正确:在判断子串没结束时,没加continue,导致有些情况存在找不到子字符串的情况;
解决:加上continue后,主串不进行移动,继续从原字符串的位置开始判断;
部分正确:没有定义新的字符串,在后面时找不到原来字符串的位置;
解决:根据超星平台上的做法,定义两个指针指向传入的字符串。当我们要对字符串进行操作时,最好定义一个新的字符串指向它,防止找不到原来位置;
3.阅读代码
1.while(m--)的操作,将两步合在一起,即m--,又判断m是否为0的两步操作
2.还有就是平时并没有宏定义的习惯,认为没必要,但看到上面这篇题解,没有宏定义的话,如果要修改MAXN的值便更加麻烦了
3.以及memset函数的用法
4.ready()以及这个函数,虽然没传入参数,但它将一部分功能分装在里面,应该会使主函数看起来更加简单明了