C博客作业05--指针

0.展示PTA总分

1.本章学习总结

1.1学习内容总结

1.指针做循环变量做法

基本做法如下:

int a[10];
int *p;
p=a;//指针指向a数组的首地址
fgets(a,10,stdin);
for(p=a;*p!='0'&&*p!='\n',p++)
{
循环结构;
}

2.字符指针如何表示字符串

基本做法如下:

char str[]="abc";
char *p;
for(p=str;*p!='0'&&*p!='\n',p++)
{
循环结构;
}

3.动态内存分配

1.动态内存分配的步骤
(1)了解需要多少内存空间。
(2)利用C语言提供的动态分配函数来分配所需要的储存空间。
(3)使指针指向获得的内存空间,以便用指针在该空间内实施运算或操作。
(4)当使用完毕内存后,释放这一空间。

2.动态存储分配函数
1.malloc()
函数原型是 : void * malloc(unsigned size)
2.calloc()
函数原型是 : void * calloc(unsigned n,unsigned size)

两者的区别仅在于calloc函数在分配后还把存储块里全部初始化为0,而malloc函数不会。

3.动态存储释放函数free()
函数原型为 : void free (void * ptr)

这个函数十分关键却又经常被人遗忘,故最好在使用动态存储分配函数时,自动先在后面补上free函数。

4.指针数组及其应用

1.指针数组的定义
一维指针数组定义的一般格式为:
类型名 *数组名[数组长度];
char * color [5];

2.指针数组的应用
可以用指针数组处理多个字符串
如课本P269页char*pcolor[]={“red","blue","yellow","green","black"};

4.二级指针、行指针

1.二级指针
二级指针,也称指向指针,一般定义为:

类型名**变量名;

2.行指针
行指针出现在二维数组中
如二维数组a[2][3];
a[0]代表的是二维数组第零行的首地址相当于&a[0][0];
a[1]代表的是二维数组第一行的首地址相当于&a[1][0];
a[0]+1代表的是二维数组第零行,第一列的地址相当于&a[0][1];

5.函数返回值为指针

当函数返回值的类型是指针时,要返回某个指针,不过要注意的是,不能在实现函数时返回在函数内部定义的局部数据对象的地址,
这是因为所有的局部数据对象在函数返回时就会消亡,其值不再有效。

1.2本章学习体会

1.由于最近各种考试扑面而来,有点顾不上C的学习,导致PTA也没怎么刷,现在线代已经考完了,接下来会全力投入C的学习当中。
2.这两周的代码量:334行。

2.PTA实验作业

2.1 6-7 输出月份英文名

2.1.1 伪代码

定义一个指针数组months[13];
months[0]表示wrong input!,其余的分别表示月份
if (n < 1或n>12)n = 0;end if;
return 英文月份;

2.1.2代码截图

2.1.3总结本题的知识点
这题是指针数组的简单运用,但一开始我的做法不是指针数组,而是用二维数组,但是后来发现二维数组是在函数内部定义的,函数结束时,它的生存期只在函数内部,所以不能用二维数组。

2.1.4PTA提交列表及说明

1.部分正确:使用的是二维数组,如上总结,本题不能使用二维数组,要用指针数组。

2.2 6-2 jmu-c-二分查找

2.2.1 伪代码

定义左右端点和中间点left,right,mid;
while(left<=right)
mid = (left + right) / 2;//二分
(*count)++;
if (中间值=key])return mid;end if
else if (中间值>key)right = mid - 1;end else if
else left = mid + 1;end else
}

2.2.2代码截图

2.2.3总结本题的知识点
形参*count是一个指针,函数中不能像之前那样count++,而是要(*count)++

2.2.4PTA提交列表及说明

答案错误:一开始写的是*count++,没有括号,后来发现及时改正。

2.3 6-6 查找子串

2.3.1伪代码

主串s:The C Programming Language
子串t:ram 
char *search(char *s,char *t)
{
定义主串遍历指针sPtr,tPtr;
while(*sPtr)
{
while(*sPtr== =*tPtr)
{sPtr++,tPtr++; }// 相同字符,则2指针同时移动
若子串在结束符,则返回子串在主串起始地址
若子串不在子串起始地址,则tPtr=t,sPtr 不动
sPtr++ ;
}
找不到,返回NULL
}

2.3.2代码截图

2.3.3总结本题的知识点
指针为NULL的状态,返回字符串所在位置:地址相减。字符相同,同时遍历2个字符串。

2.3.4PTA提交列表及说明

3.阅读代码

1.代码功能:在 haystack 字符串中找出 needle 字符串出现的第一个位置,即实现strstr函数。通过两个标记对字符串进行遍历,进行边界处理之后,使用 k 进行角标标记,first 用于 拨正 i 循环的起点。
2.代码优点:与PTA上做的查找子串不同,他进行了两次标记进行遍历,当needle是空字符串时,要返回0。

posted @ 2019-12-01 14:52  王柏鸿  阅读(239)  评论(0编辑  收藏  举报