0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
- 指针与数组:数组的基地址是在内存中存储数组的起始地址,它是数组中第一个元素(下标为零)的地址,因此数组名本身是一个地址即指针值。可以把它看作是指针常量。且两个相同类型的指针相减,表示它们之间相隔的数组元素数目。使用数组和指针可以实现相同的操作,但是指针的效率高,更灵活。
int i,a[10],*p;
sum=0;
for(p=a;p<=a+9;p++) //使用指针求和
sum=sum+*p;
- 字符指针:字符数组和字符指针都可以用来处理字符串。字符指针只占用一个可以存放地址的内存单元,存储字符串首字符的地址。而要改变指针所代表的字符串,通常直接改变指针的值,让它指向新的字符串。定义字符指针后要对其赋值,可先将其初值置为空。
电码加密
void encrypt(char *s)
{
for(;*s!='\0';s++)
{
if(*s=='z')
*s='a';
else
*s=*s+1;
}
}
- 指针做函数参数:要通过函数调用来改变主调函数中某个变量的值,可以把指针作为函数的参数。
month_day(year,yearday,&month,&day); //调用计算月,日函数
void month_day(int year,int yearday,int *pmonth,int *pday)
{
...
*pmonth=k;
*pday=yearday;
}
- 二级指针,行指针:指向指针的指针称为二级指针。行指针是指第一行的首地址,是指首行一整行,并不是指某个具体元素。
int *pa=&a,*pb=&b; /* **ppa与*pa、a三者等价,**ppb与*pb、b三者等价 */
int **ppa=&pa,**ppb=&pb;
- 指针数组及其应用:如果要处理多个字符串,通常使用二维字符数组或者指针数组。
int i;
char *pcolor[]={"red","blue","yellow","green","black"};
for(i=0;i<5;i++)
printf("%s",pcolor[i]);
- 指针做函数返回值:
1.不能在实现函数时返回在函数内部定义的局部数据对象的地址,因为所有的局部变量在函数返回时就会消亡,其值不再有效。
2.函数返回值的类型可以是指针类型,即函数可以返回一个地址。且返回指针的函数一般都返回全局数据对象或主调函数中数据对象的地址。
1.2 本章学习体会
- 觉得使用指针很难,就是很难想出怎么调用指针来解决问题,还是用了许多前面的知识来做题。
- 时间|代码量
--😐:--:
两周|300行左右
2.PTA实验作业
2.1 6-2 jmu-c-二分查找
2.1.1伪代码
定义指针a,用以实现对数组的遍历;指针count,用以统计查找次数及返回数据
二分法查找,定义相应查找范围的上限high和下限low,取中间值middle
不断比对下标为middle的元素与关键字key是否相等,从而变化查找范围的上限或下限
while (low <= high)
{
middle取值
指针count的值加一
三种情况
}
end while
return -1
2.1.2 代码截图
2.1.3 总结本题的知识点
- 指针作为函数的形参,可返回多个数据,并可用二分法在数组中查找关键字。
2.1.4 PTA提交列表及说明
提交列表说明:
- 部分正确:(*count)++语句的位置放错,应放于条件判断语句的前面。
- 答案错误:while循环语句中的条件错误,且(*count)++语句的位置放错,应放于条件判断语句的前面。
2.2 6-3 拆分实数的整数与小数部分
2.2.1伪代码
定义指针intpart用来指向实数的整数部分并返回数据, 指针fracpart用来指向实数的小数部分并返回数据
定义一个变量,用来存储实数的整数部分
i=(int)x; //强制类型转换
改变指针指向的内容,再返回回去
2.2.2 代码截图
2.2.3 总结本题的知识点
- 指针作为函数的形参,可返回多个数据,并可用强制类型转换得到实数的整数部分
2.2.4 PTA提交列表及说明
2.3 6-4 求出数组中最大数和次最大数
2.3.1伪代码
for()
找出最大值和次大值对应的下标
end for
交换a[0]中的数和最大值所对应的数
条件判断次大值的值,进行不同运算
return 1;
2.3.2 代码截图
2.3.3 总结本题的知识点
- 通过控制数组的下标来简洁地进行数据的比较,同时通过指针实现对数组的遍历。
2.3.4 PTA提交列表及说明
提交列表说明:
- 答案错误:错误定义指针,造成程序出错。且有的地方指针前的*号添加错误或者漏写。
3.阅读代码
题目名称:实现 strStr()函数
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
代码:
int strStr(char * haystack, char * needle){
// needle 是空字符串,认为所有字符串都包含空字符串,索引为 0
if (needle == 0) return 0;
// haystack 是空字符串,认为它不包含任何字符串(空字符串除外)
if (haystack == 0) return -1;
// 标记 haystack 的头指针
char * head = haystack;
// 扫描偏移
int offset;
// 遍历 haystack 的子串
while (*haystack) {
offset = 0;
while (1) {
// 到达 needle 末尾,认为能匹配上
if (needle[offset] == 0) return haystack - head;
// 到达 haystack 末尾,认为没有匹配
if (haystack[offset] == 0) return -1;
// 不相等则跳出本次循环
if (haystack[offset] != needle[offset]) break;
offset++;
}
// 移动到下个子串
haystack++;
}
return -1;
}
此代码值得借鉴的地方:
- 定义了一个指针,实现对字符串子串的遍历。
- 考虑到了两种特殊情况,即要查找的字符串和被查找的字符串分别为空字符串的情况。