代码改变世界

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'来制造连接点*