C博客作业05--指针

0.展示PTA总分(0----2)

展示关于“指针题目集”分数截图。

1.本章学习总结(3分)

整理指针主要知识点,必须包含内容有:

1.1 指针定义、指针相关运算、指针做函数参数。

  • 指针定义
    C 语言规定所有变量在使用前必须先定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门用来存放地址的,所以必须将它定义为“指针类型”。
    要注意指针的类型和它所指的类型需要相同。
    基类型 *指针变量名;
  • 相关运算
    将整型变量a的地址赋给整型指针p,使指针p指向变量a。
    将a的地址给p1,再将p1的值给p2,所以指针p1与p2都指向a,即p1=p2=a。
    赋值:直接对p赋值,如p=0,表示p=NULL
    p=4,表示对指针p所指的内容赋值,如 p=a,p=4,表示a=4
  • 指针做函数参数
    用指针变量作为函数参数, 在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来,这样就实现了”通过调用函数使变量的值发生了变化,在主调函数(如main函数)中使用这些改变了值”的目的.

1.2 字符指针

包括指针如何指向字符串、字符串相关函数及函数代码原型的理解、字符串相关函数用法(扩展课堂未介绍内容)

  • 字符指针:指向字符型数据的指针变量。
  • 相关函数(常用)
函数名 函数格式 作用
strcpy strcpy(a,b) 把b字符串内容赋给a字符串 可以使用strncpy能自定义赋值的位数
strcmp strcmp(a,b) 将a串与b串比较 1.a大值为1,b大值为-1,相等值为0. 2.可以使用strncmp自定义比较位数
strcat strcat(a,b) 把b串从头接到a串末尾 可以使用strncat自定义追加位数
strstr strstr(a,b) 在a串中找到b串首次出现的地址 不会包含结束符

1.3 指针做函数返回值

  • 格式
    格式为: 数据类型 *函数名称(形式参数列表) 例如: int *Fun(float x, float y);
    返回值为地址。

  • 注意事项
    函数的返回值类型需要定义成指针变量类型。

1.4 动态内存分配

  • 为什么要动态内存分配?
    动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存。
  • 堆区和栈区区别
    前面所写的程序大多数都是在栈上分配的,比如局部变量、形参、函数调用等。栈上分配的内存是由系统分配和释放的,空间有限,在复合语句或函数运行结束后就会被系统自动释放。
    而堆上分配的内存是由程序员通过编程自己手动分配和释放的,空间很大,存储自由。
  • 相关函数
    malloc函数:
int *p=NULL;
p=(int *)malloc(2);

该函数的功能是在内存的动态存储空间即堆中分配一个长度为size的连续空间。函数的返回值是一个指向所分配内存空间起始地址的指针,类型为 void*型。通常需要进行强转
如果此函数未能成功地执行,如内存空间不足,则返回空指针 NULL。

calloc函数:

p=(int *)calloc(10,sizeof(int));

分配n个大小为s的堆区,与malloc分配的连续的空间不同
申请堆区空间后要记得在使用完之后释放.

1.5 指针数组及其应用

  • 格式:
类型名 *数组名[数组长度];
  • 区别
    二维数组:一旦定义,那么每个字符数组的字符串最大长度和首地址都不能改变
    字符指针数组:比二维字符数组更加灵活,其指向的每个字符串的首地址可以改变,字符串最大长度也可以改变。

1.6 二级指针

  • 格式:
类型名 **变量名;

如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。

1.7 行指针、列指针

定义格式、主要用法。

  • 格式:

行指针:

类型名 (*变量名)[数组长度]

列指针:

类型名 [数组长度](*变量名)
  • 用法
char a[5][10];
char (*p)[10];
p=a;
char *q[10]=a;

2.PTA实验作业(7分)

2.1 藏尾诗(2分)。

2.1.1 伪代码

定义整型变量i,j
定义二维数组poem
定义字符型行指针p
定义整型变量x存放每行诗长度
p=poem
for i=0 to 4
	输入每行
end for
for p=poem to poem+4
	x=*p的长度
	输出 (*p)+x-2
end for

2.1.2 代码截图

2.1.3 找一份同学代码比较,说明各自代码特点。


同学的代码思路主要是再定义一个数组存放尾字,没有用到指针,思路差距较大

2.2 选择合并2个有序数组

2.2.1 伪代码

int* c
    c = (int*)malloc((m + n) * sizeof(int))
定义整型变量i,j,k
i是第一个数组a中的数的顺序
j是第二个数组b中的数的顺序
while k<m+n
if k<m+n 数组a,b中的数都没用完
      if a[i] < b[j]
            c[k] = a[i]
            i++
      else
            c[k] = b[j]
            j++
else
      if a用完
            c[k] = b[j]
            j++
      else
      c[k] = a[i]
      i++
end if
k++
end while
输出
释放

2.2.2 代码截图

2.2.3 找一份同学代码比较,说明各自代码特点。

展示同学代码

同学的代码 思路上与我有些像 但各种判断要更加简洁易懂,代码量也比我少,各种分支判断值得我学习

2.3 反话-加强版

2.3.1 伪代码

定义字符型指针变量p,q,a,e
定义整型变量 x,count,flag
x=strlen(p)
p = (char*)malloc(sizeof(char) * 600000)
for q=p to p+x-2
      if *q=空格
            for a=q+1 to q+count
                  输出*a
            end  for
            if count不为0
                  flag=1
                  for e=p to q
                        if *e不是空格
                        flag=0
                        break
                  end for
           if flag为0
                  输出空格
            end if
            count=0
      end if
      else
            count++
            if q等于p且*p不为空格
                  for a=q to q+count
                        输出*a
                  end for
            end if
end for

2.3.2 代码截图

2.3.3 请说明和超星视频做法区别,各自优缺点。

超星视频做法:逆向遍历数组,遇到空格计算单词长度输出,长度设为0
其实和我的方法有点像,只是我的代码比较繁琐,虽然做了很久,但还是独立做出来的

posted @ 2020-12-27 21:44  黄帅2011  阅读(86)  评论(0编辑  收藏  举报