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函数(针对整型的绝对值函数)用以处理菱形问题十分方便

posted @ 2019-12-01 15:01  一个敢敢  阅读(293)  评论(0编辑  收藏  举报