c博客作业05-指针
2019-12-01 20:15 pluto1214 阅读(270) 评论(0) 编辑 收藏 举报0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
指针做循环变量做法
定义sum,*p,a[10]
for(p=a;p<a+10;p++)
{
sum=sum+*p;
}
字符指针如何表示字符串
另字符指针指向字符串的首地址
eg.char *p,str[10];
p=str;
动态内存分配
(强制转化(函数名(数量,sizeof(类型名)))
eg.p=(int*(calloc(n,sizeof(int)))
指针数组及其应用
指针数组中的每一个元素都是一个指针,若为字符指针数组,则元素分别指向一个字符串
定义:类型名 *数组名[];eg.char *color[]
其中,color[i]是一个地址,而color[i+1]是下一个字符串的首地址,color[i]+1是此字符串的下一个字符
用于字符串的排序
定义指针数组str[]
if(strcmp(str1[i]>str[i+1])
用于比较字符串的长度大小
if(strlen(str1[i]>str[i+1])
二级指针、行指针
二级指针是指向指针的指针
eg.int *p,a;
int **pp;
p=a;
pp=p;
则pp中存放的是指针p的地址,p存放a的地址,所以*pp,p,&a相同,**pp,*p,a相同
行指针
定义:int (*p)[n];行指针是指向一维数组的指针
行指针可以和数组名互换使用,p[i][j]=a[i][j]
函数返回值为指针
返回的值是一个地址,一般为NULL或某数组某个元素的地址
接受函数的返回值的变量是一个指针
定义:eg.char *(char *p);
- 指针储存的是地址
- *定义指针:类型名 指针变量名
- 要用指针时,必须先赋值,eg.p=&a
- 指针只能指向同种类型的变量
- 数组名时一个地址常量,可以用指针直接指向数组名,p=a等价于p=&a[0]
- 若指针p指向数组a,*(p+1)等于a[1]
- 计算数组中两个元素之间的个数,可用两个指针先赋值再相减
- 定义一个指针指向字符串,则该指针指向字符串的首字符
- 字符串复制函数strcpy(str1,str2),将str2赋值给str1
字符串连接函数strcat(str1,str2),将str2连接到str1后
字符串比较函数strcmp(str1,str2),比较str1和str2的大小,若相等,值为0,若str1>str2,值为正数,否则为负数
1.2 本章学习体会
- 指针的知识难度大,掌握不熟,经常运行程序时发现程序无法运行,但又找不出原因,应该为课本的基本知识还不熟悉的原因,需要将课本知识多看以便更好掌握
- 两周代码量为700行,达到目标
2.PTA实验作业
2.1 题目名1(指针做函数返回值) 查找指定字符
2.1.1 伪代码
定义函数查找位置char* search(char* str, char c)
{
定义字符变量c,字符数组s,指针*position
输入查找字符c,给s赋值
调用函数search
if(position为0)
表示找不到该字符
else
printf(输出下标)
}
函数search内容
{
定义指针*pos
pos=NULL;
while(遍历字符串)
{
if(相等)
pos=str;
str++;
}
2.1.2 代码截图
2.1.3 总结本题的知识点
**1.数组中两个元素之间元素的个数用两个指针相减表示,eg.position-s
2.需要用到指针的地址时,要习惯性先将地址赋值NULL
3.查找指定字符做法
若pos还是NULL,则找不到,反之则找到
pos =NULL;
while (str != '\0')
{
if (str == c)
{
pos=str;
}
str++;
}**
2.1.4 PTA提交列表及说明
1.多种错误:忘记给pos赋初值,使pos=NULL
2.部分正确:输出时直接输出position,position为地址,应该输出position-s
3.部分正确:格式错误
2.2 题目名2说反话
2.2.1 数据处理
{
定义指针pEnd,pBegin,p;
遍历输入的句子,求出其长度pEnd;
p=pEnd-1;
while (p != pBegin)
{
当*p!=' ',长度len++;
当*(p-1)=' ',输出单词,并让len=0;
}
输出最后一个单词
}
2.2.2 代码截图
2.2.3 总结本题的知识点
- **逆向遍历字符串方法
while(p!=首地址) - printf("%.*s",len,p)可以输出从p开始的长度为len的字符串
- 找单词,p是字母,而p的前一个或后一个是空格**
2.2.4 PTA提交列表及说明
- 错误:没有再输出一个单词后将length=0
- 错误:没有输出第一个单词,因为循环结束时第一个单词在循环内部不会被输出。解决方法:if(*p=' ')输出第一个单词
- 输出第一个单词时,直接输出length.解决:输出length+1
2.3 题目名3字符串的冒泡排序
2.3.1 数据处理
{
for()第一层循环i从0到k
for()第二层循环j从0到n-i-1
if (strcmp(a[j], a[j + 1]) > 0)
{
交换a[j]和a[j+1]
}
}
2.3.2 代码截图
2.3.3 总结本题的知识点
- 用二维数组来存储多个字符串
- 输入方式for (i = 0; i < n; i++)
scanf("%s", &a[i]); - 字符串之间的大小比较用strcmp(),复制用strcpy()
- 冒泡排序法第一层循环若为for (i = 1; i <= k; i++),则第二层循环for (j = 0; j < n - i; j++)
- 第一层循环若为for (i = 0; i < k; i++),则第二层循环for (j = 0; j < n - i-1; j++)
2.3.4 PTA提交列表及说明
- 错误1:冒泡法错误,两层循环为
for (i = 1; i <= k; i++)
for (j = 0; j < n - i-1; j++)
将j<n-i-1改为j<n-i - 错误2:格式错误,没有换行,改为printf("..\n",..)
3.阅读代码
- **代码功能,删除a中出现的所有子串b后的结果字符串。**
- *可学习地方:strstr(str1,str2)函数,若在str1中找到str2,则返回str2在str1中的首地址,否则返回NULL
strcat是从'\0'的位置开始连接,该代码利用找到后另*p='\0'来制造连接点*