C博客作业05--指针
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.* 为指针标识符。 如:*p
格式:datatype name = value; //定义格式
int p; //定义,定义时必须带 。
float p1 = &a;
char p2 = &c;
p1 = &b;
p2 = &d; //赋值,在定义的同时赋值需要带,单独赋值时不能带,因为P代表指针变量的值,即地址。P代表指针指针变量指向的变量的值。
- 通过指针变量可以获取内存上的数据,也可以修改内存上的数据(P=&a;*p=b;)
- *p 代表的是 a 中的数据,它等价于 a,可以将另外的一份数据赋值给它,也可以将它赋值给另外的一个变量。
- 在不同的场景下有不同的作用:
- 可以用在指针变量的定义中,表明这是一个指针变量,以和普通变量区分开;
使用指针变量时在前面加*表示获取指针指向的数据,或者说表示的是指针指向的数据本身。 - 在32位操作系统下都在0 ~ 4,294,967,295这个数区间内,所以:在32位操作系统下,任何类型的指针变量都占四个字节
2.字符指针和字符数组的区别:
- 数组形式:
char string[] = “hello world"; - 字符指针形式:
char *str = “hello world"; - 1、储存方式:
(1)字符数组由若干元素组成,每个元素存放一个字符,
(2)而字符指针变量只存放字符串的首地址,不是整个字符串。 - 2、存储位置:
(1)数组是在内存中开辟了一段空间存放字符串;
(2)而字符指针是在文字常量区开辟了一段空间存放字符串,将字符串的首地址付给指针变量str。 - 3、可否被修改:
(1)指针变量指向的字符串内容不能被修改,但指针变量的值(即存放的地址或者指向)是可以被修改的;
(2)字符串数组内容可以被修改,但字符串数组名所代表的字符串首地址不能被修改
3.指向函数的指针(函数指针):
一个函数在编译时被分派一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。
其声明格式为:返回值类型 (fun_ptr)(参数列表)
如 int (p)(int a, int b); p是一个指针变量,它指向一个函数,这个函数有2个整型参数,函数返回值类型为int。p首先和*结合,说明p是一个指针,然后再与()结合,说明它指向的是一个函数,指向函数的指针即为函数指针。
4.返回指针值的函数:指针函数
返回指针的函数:一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址;
定义形式为:类型名 *函数名(参数表列); 例如:int a(int x,int y); 注意与指针函数int (a)(int x,int y)不合。
注意:在挪用时要先定义一个适当的指针来接收函数的返回值,这个适当的指针其类型应为函数返回指针所指向的类型。
例:pc = (char *)malloc(100);暗示分派100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针付与指针变量pcchar *pc=NULL;pc = (char *)malloc(100);void类型的指针void指针是一种很特另外指针,其实不指定它是指向哪一种类型的数据,而是根据需要转换为所需数据类型。
1.2 本章学习体会
指针果然是C语言的灵魂,其作用十分巨大,但是学习起来也难度不小,刚刚接触时还很蒙圈,再加上这周事情特多都没复习导致更加难以理解,还好利用空余时间复习并敲了一些PTA题目,现在总算对指针有了一定了解,但是想要深入还要继续应用实践。
2.PTA实验作业
2.1 7-1(指针做函数返回值) 查找指定字符
2.1.1伪代码
定义一个函数char* fin(char* str,char op)
定义两个字符型变量op,ch用来储存想要查找的字符和吸收‘\n’
定义一个字符数组,
用fgets读入字符串,并在字符串的最后加上‘0’。
向函数fin传入str首地址和字符op,
在函数中遍历数组,计录指针的偏移量
if(条件不满足)返回NULL
else返回str+偏移量
if(条件满足)输出Not Found
else输出下标。
2.1.2 代码截图
2.1.3 总结本题的知识点
ch 储存多余‘n\’
fgets读入字符串,最后要记得赋零
指针做函数返回值的函数的写法
下标偏移量和指针位置的关系
2.1.4 PTA提交列表及说明
提交列表说明:
1:没有考虑到第一个就符合的情况
2:第一个就返回的判断错误
3:格式错误(其实前几个错误就有了。。。)按题目要求改了一下就过了
2.2 6-9 合并两个有序数组(2)
2.2.1伪代码
根据传入的参数
定义一个整型指针p指向首地址
for i 0 to n step 1 do
将数组n接到数组m后面
end
for i 0 to m+n-1 step 1 do
{
for j i to m+n step 1 do
找出最小值的指针将它和第一个交换
end
}//将合并的数组从小到大排序
end
2.2.2 代码截图
2.2.3 总结本题的知识点
数组的合并
选择法排序
指针操作数组内容
2.2.4 PTA提交列表及说明
提交列表说明:
1:用我自己先合并再排序的方法,发现数据量太大时会超时
2:用同学在定义一个数组,在同时移动指针排序,用空间换时间超时的测试点就过了
2.3 6-4 求出数组中最大数和次最大数
2.3.1伪代码
定义一个整型变量max储存最大值的偏移量
for i 1 to n step 1 do
找出最大值的偏移量
end
和a[0]交换
for i 2 to n step 1 do
找出次小值的偏移量
end
和a[1]交换
2.3.2 代码截图
2.3.3 总结本题的知识点
用循环找最大
用指针操作交换数组中的两个数
2.3.4 PTA提交列表及说明
提交列表说明:
1:没有交换直接将找到的最大值赋给a[0],导致原来的还在
2:交换是写反了导致两个位置相同
3.阅读代码
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,n=9;
char c='A'-1;
for(i=1;i<=2*n-1;i++)
{
k=n-abs(n-i);
for(j=1;j<=abs(n-i)+1;j++)
{printf("+");}
for(j=1;j<=2*k-1;j++)
{c++;
printf("%c",c);
if(c=='Z')
c=c-26;
}for(j=1;j<=abs(n-i)+1;j++)
{
printf("+");
}
printf("\n");
}
return 0;
}
效果:
abs函数(针对整型的绝对值函数)用以处理菱形问题十分方便