c博客作业 指针

0.展示PTA总分

在这里插入图片描述

1.本章学习总结

  • 一维数组数组名即为地址

  • 二维数组名是个二级地址

  • 例:对a[3][4]来说 * ( *(a+i)+J)为a[i][j]的值

  • 通过指针传参可以改变多个变量的值

  • 指针变量的定义:类型名 * 指针变量名 其中类型名是指针指向数据的类型 指针变量名可随意 常用p 因指针翻译为pointer。

  • 指针变量的赋值:例:int i=2; int *p; p=&i; 指针必须赋值 否则造成内存混乱 若不知赋予什么值 可令指针为NULL

  • 指针作循环条件 通常再定义一个指针 例:

void re(char *p)
{
    char *p1;
    p1=p;
    for(;p1++;*p1!=0)
    {
        cnt++;
    }
}
  • 两个变量值的交换:
void exhcange(char *p1,char *p2)
{
    char a=*p1;
    *p1=*p2;
    *p2=a;
}
  • 指针的冒泡排序与数组没什么区别 将a[]换成*a即可
  • 常用字符串处理函数:
  • scanf() gets() fgets(array,number,stdin)这三个函数用来输入字符串 scanf函数遇到空格和回车结束 gets不安全会越界 最好用fgets 遇到回车结束 在字符串的后两位分别是\n和\0 使用strlen时应减1
  • puts()函数与printf()函数 puts遇\0变为\n 其他无区别
  • 字符串复制函数strcpy(s1,s2) 用s2将s1覆盖 需要确保s1空间足够
  • 字符串链接函数 strcat(s1,s2) 将s2链接在s1后面
  • 字符串比较函数strcmp(s1,s2),注意其比较的是ASCII码 从数组首项开始一直比较到有一边出现了\0或有一个字符大小不一样结束 若S1>S2返回1;s1=s2 返回0;s1<s2返回-1
    函数原型:void *malloc(unsigned size)
    申请size长度的空间 若成功则返回指针 通常需强制类型转换
  • free()
    释放malloc函数申请的空间

1.2本章学习体会

  • 指针是c语言的灵魂 且flexible and tough

  • 代码量2000行

2.PTA实验作业

6-8 计算最长的字符串长度 (15分)

2.1.1 伪代码

主函数
int i, n;
    char *string[MAXN] = {NULL};
    定义字符数组 并赋值
    调用函数int max_len( char *s[], int n );
    通过下标法来选出最长的字符串 
    for(int i=0;i<n;i++){
        if(strlen(s[i])>max){
            max=strlen(s[i]);
        }
    }max初始化为0 每当有字符串的长度更长时 则交换
    最后返回max的值

2.1.2 代码截图

在这里插入图片描述

2.1.3 总结本题的知识点

本题是对下标法的灵活运用 将一个较为麻烦的题目变得简洁明了
并设计指针传参 字符指针数组传参时 若是char *a[10]则函数括号里也应是char *a[]

2.1.4 PTA提交列表及说明

在这里插入图片描述
错误:函数传参时只写了*s 原来没有用下标法而是将所有长度算出来存入数组并排序

2.2 填充矩阵

2.2.1伪代码

观察输出样例 该函数应有三个循环 对应对角线 上三件和下三角
首先将所有元素赋值3
for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			if (i + j<n-1) {
				p[i][j] = 3;
再将对角线元素赋值1
else if (i + j == n - 1) {
				p[i][j] = 1;
			}
最后将下三角赋值2
else if (j + i>n-1) {
				p[i][j] = 2;
				}

2.2.2 代码截图

在这里插入图片描述

2.2.3 总结本题的知识点

对于指向二维数组的指针 可由int(*p)[n]=a定义 表示p是a[0]的地址
*p即为a[0],**p为a[0][0] 且对于矩阵 可写出行与列的关系找函数关系

2.2.4 PTA提交列表及说明

在这里插入图片描述
其实在编译器里错了很多次 主要是行与列的关系没有找精确

2.3 6-5 字符串反正序连接 (10分)

2.3.1伪代码

#include <stdio.h>
void fun (char *s, char *t);
int main()
{ char s[100], t[100];
scanf("%s", s);
fun(s, t);
printf("%s\n", t);
return 0;
}
\\裁判使用 
void fun (char *s, char *t){
    int cnt=0;
    char *c=s;
    while(*c不为0)
    {
    c++;
    cnt++;
    }
    //计算其长度
    知道长度后可从最后面往前逆序将元素放到另一个数组
    for(int i=cnt-1;i>=0;i--){
        *(t+k)=*(s+i);
        k++;
    }//
    最后再按顺序添加
    for(int i=0;i<len;i++)
    {
        *(t+k)=*(s+i);
        k++;
       
    }
    *(t+k)=0;
    并将最后一位赋值0

2.3.2 代码截图

在这里插入图片描述

2.3.3 总结本题的知识点

通过对指针的灵活运用 先计算字符数组长度 再逆序 存放 到另一个数组

2.3.4 PTA提交列表及说明

在这里插入图片描述
第一次段错误忘记将k赋值0 第二次忘记在数组最后加上\0

3.阅读代码

在这里插入图片描述
在这里插入图片描述
这个代码将yyyy/mm/dd”加24小时制编程实现将其转换成”mm/dd/yyyy”加12小时制格式的字符串。

posted @ 2019-12-17 08:25  啊是大家肯定会  阅读(217)  评论(0编辑  收藏  举报