zoukankan      html  css  js  c++  java
  • C博客作业05--指针

    0.展示PTA总分

    1.本章学习总结

    1.1学习内容总结

    1.1.1指针大概

    • ①专门用来存放变量地址的变量称为“指针变量”,简称为指针。

    • ②指针变量的定义:类型名 *指针变量名; 如 int *p;

    • ③在定义指针变量时,指针声明符不是指针的组成部分,如 intp; 表示p是指针变量,不是p。

    • ④指针类型的变量是它所指的变量的数据类型,不同类型的指针变量所占的内存空间是大小相同。

    • ⑤定义完指针变量后要先赋值再使用,如果没有被赋值,它将指向一个不确定的单元,即野指针。

    • ⑥指针变量的赋值:如 p = &i; 或 p = 0; 或 p = NULL; 或 p = (int*)1732; 但不能将其他数值作为指针变量的初值。

    • ⑦ p = 0; 或 p = NULL表示空指针,空指针不指向任何单元。

    1.1.2指针的基本运算

    • ①相同类型的指针能进行赋值、比较和算术运算。

    • ②两个指针不能相加,但可以相减,二者的差值表示二者相隔的存储单元。

    • ③在完成定义后,*表示间接访问运算符,用于访问指针所指向的变量。

    • ④如 p=p+1、++p 和 (p)++ 都是将指针所指向变量的值加一;而p++等价于(p++) 表示先取*p的值作为表达式的值,再将指针p的值加一。

    1.1.3指针作为函数的参数

    • ①调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。

    • ②在函数定义时将指针作为指针作为形参,在函数调用时将变量的地址作为实参。

    • ③将指针作为函数的参数就能使函数返回多个值。

    1.1.4指针、数组和地址

    • ①数组的基地址是数组中第一个元素(下标为0)的地址,所以数组名本身是一个地址即指针值。

    • ②在访问内存方面,指针和数组几乎相同,如 p=a; 等价于 p=&a[0]; *(a+i)等价于a[i]。

    • ③数组与指针的区别:指针是以地址作为值的变量,而数组名的值是一个特殊的固定地址,即指针常量,所以a=p是非法的。

    • ④p为指针a为数组,p=a+1是合法的,a=a+1是非法的,a+i是合法的,a++是非法的。

    • ⑤设p和q是指向数组元素的指针,则p-q产生一个int型的值,该值表示在p和q之间的数组元素的个数。

    • ⑥当指针指向数组,指针加1或减1时,并非指针的值加1或减1,而是加上或减去该指针所指向的那个变量数据类型的长度,即所占的字节数。如p指向a[1],设用2个字节存储整型数据,且a[1]的地址为2004,则p--后,p的值为2002,即a[0]的地址。

    1.1.5字符指针

    • ①调用printf()函数,以%s的格式输出字符串(直到遇见''为止),作为输出参数,数组名、指针和字符串的值都是地址。如:
      printf("%s",sa+2); //以数组元素sa[2]的地址作为输出参数
      printf("%s",sp+3); //以sp+3作为起始地址
      printf("%s",“string”); //输出string

    • ②字符指针与字符数组的不同:字符指针存储字符串首字符的地址,而字符数组的每个元素防一个字符,字符串就存放在数组中。

    1.1.6用指针实现内存动态分配

    • ①动态存储分配函数malloc()
      功能:在内存的动态存储区中分配一连续空间,其长度为size。若申请成功,返回指向分配内存空间的起始地址的指针;若不成功,返回NULL。

    • ②计数动态存储分配函数calloc()
      功能:在内存的动态存储区中分配n个连续空间,每一存储空间的长度为size,并把内容全初始化为0。若申请成功,返回指向分配内存空间的起始地址的指针;若不成功,返回NULL。

    • ③动态存储释放函数free()
      功能:释放由动态存储分配函数申请到的整块内存空间,在某个动态分配的存储块不再用时,应及时将它释放,该函数无返回值。

    • ④分配调整函数realloc()
      功能:更改以前的存储分配,

    1.1.7指针数组

    • ①一维指针数组定义格式:类型名 *数组名 [数组长度];

    • ②数组的元素类型是字符指针,用于存放字符数据单元的地址。
      如:printf("%x",color[i]); //以16进制的方式输出color[i]所指向的字符串的首地址。

    • ③对指针数组元素的操作与对同类型指针变量的操作相同。

    1.1.7二级指针

    • ①二级指针定义:类型名**变量名;


    • 定义int a=10; int p=&a; int **pp=&p
      p指向a,p与&a的值一样,a与
      p代表同一个单元
      pp指向p,pp与&p的值一样,p与pp代表同一个单元
      &&a、&&p和pp等价,&a、p和
      pp等价,a、*p和**pp代表同一单元。

    1.1.8二维数组的指针形式

    • ①int a[3][4];
    说明
    a 二维数组名是一个二级指针,即a[0]的地址
    a[0] 一级指针,即a[0][0]的地址
    a+i 第i行的地址
    *(a+i) 第i行首元素的地址,等价于a[i]
    **(a+i) 第i行首元素的值
    • ②虽然a、a的值相同,但含义不同。a是行元素数组的首地址,又称行地址,是二级指针。而a是首行第一个元素的地址,又称列地址,是一级指针。

    *1.2本章学习体会

    1.2.1学习感受

    指针这块内容确实比较难理解,我PTA上的大多数题目都是用数组的操作思维完成的,现在通过博客重新过了一遍书本的内容,发现指针在一些方面确实有它独特的优势,一定要好好学。

    1.2.2代码量

    代码量大约394行。

    2.PTA实验作业

    2.1计算最长的字符串长度

    2.1.1伪代码

    int max_len(char* s[], int n)
    {
        设i用于循环,设len表示各个字符串的长度,设max表示最长长度并赋初值0
    
        for i = 0 to i<n
    	    len记录各个字符串长度
    	    if (len > max)	//比较当前字符串长度与之前的最长长度
    		    发现更长的,就赋值给max
    	    end if
        end for
    
        返回max
    }
    

    2.1.2代码截图

    2.1.3造测试数据

    输入数据 输出数据 说明
    4换行blue换行yellow换行red换行green 6 正常数据
    3换行ccc换行ccc换行ccc 3 有重复数据时,程序仍正常
    0 0 仅输入0时,输出max的初值
    -1 0 输入负数时,输出max的初值
    11换行a换行a换行a换行a换行a换行a换行a换行a换行a换行a换行aa 2 超过10组数据且最长数据在最后,程序的结果虽然正确,但VS有溢出报错
    2换行g换行jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj 程序炸了,第二组数据溢出,VS报错
    a 0 程序炸了,通过设printf显示输入的a被转换成了-858993460,使程序输出max的初值

    2.1.4PTA提交列表及说明

    • Q1:答案错误

    • A1:没仔细审题,没看见#include <string.h> 于是用了sizeof计算各个字符串的长度,测试时,一直输出4,后来查了资料才知道sizeof用来求分配给某某的内存空间大小的,而指针一般分配4字节,
      于是结果就是4,改用strlen就全通过了。

    2.2藏尾诗

    2.2.1伪代码

    main函数
        设i、k用于循环,定义poem数组存放诗,定义end数组存放尾字
    
        for i = 0 to i < 4
    	    输入每行的数据
    	    将倒数第二个有意义字符放入end数组中
    	    将倒数第一个有意义字符放入end数组中
        end for
    
        end[8] = 0;
        输出end数组
    

    2.2.2代码截图

    2.2.3造测试数据

    输入数据 输出数据 说明
    悠悠田园风 然而心难平 兰花轻涌浪 兰香愈幽静 风平浪静 正常数据
    悠悠田园风 然而心难平 兰花轻涌浪 兰香 风平浪香 每行长短不一,程序正常运行
    悠悠田园风 然而心难平 兰花轻涌浪 风烫平浪 缺一句的数据,由于第二行数据是换行,因此程序在生成第二个数据时会以乱码处理

    2.2.4PTA提交列表及说明

    • Q1:运行时错误

    • A1:忘了一个汉字占两个字节,在定义表示尾字的数组时长度给小了,在扩大数组长度后就通过了。

    2.3说反话-加强版

    2.3.1伪代码

    main函数
    定义i、j用于循环,定义len表示字符串长度,定义woerdLen表示各个单词长度
    定义flagFirst用于判断是否为句首,定义str数组用于存储字符串

    输入字符串
    计算字符串长度并处理
    
    for i = len to  0
    	if 发现单词
    		记录单词长度
    	else if 一个单词记录完毕
    		if 句尾第一个词
    			flagFirst为0
    		else
    			输出空格
    		end if
    		输出单词
    		end for
    		单词长度清零
    	end if
    end for
    
    if flagFirst为0		//句首为空格
    	if 单词长度大于0 
    		输出空格
    		输出单词
    	end if
    else				//句首不为空格
    	if 单词长度大于0
    	    输出单词
    	end if
    end if
    

    2.3.2代码截图

    2.3.3造测试数据

    输入数据 输出数据 说明
    Hello World Here I I Here World Hello 中有多个空格,正常输出
    Hello World Here I I Here World Hello 句首有多个空格,正常输出
    Hello World Here I I Here World Hello 句尾有多个空格,正常输出
    a a 最小词且前有空格,正常输出
    aa aa 一词且后有空格,正常输出
    苏卡 不列 不列 苏卡 有汉字,正常输出
    全空格,无输出
    换行 直接退出程序

    2.3.4PTA提交列表及说明

    • Q1:部分正确

    • A1:存在格式错误问题,经检查,发现我的程序中在输出单词后会自动补充一个空格,于是决定删去此功能,增加判断语句。

    • Q2:部分正确

    • A2:“一个词,末尾有空格”测试点显示答案错误,如输入“aa ”时,程序无输出,经检查,发现我的判断语句未能识别该类情况,再次对判断语句进行完善补充。

    • Q3:编译错误

    • A3:拼写错误,纠正后就全通过了。

    3.阅读代码

    • 代码功能:计算一段字符串中有多少个符合要求的字串。

    • 优点一:巧用>>和<<实现了对数据的灵活处理。

    • 优点二:巧用hash数组以下标的方式实现了对子串的重复判断与个数计算

  • 相关阅读:
    Yii框架(一)
    phpStorm中使用xdebug断点调试php代码
    在mysql存储过程中拼接sql解决in的字段类型不匹配问题
    openjdk源码阅读导航
    深入理解tomcat9---源码构建
    API权限控制与安全管理
    java虚拟机性能监控调优及原则
    java十年技术栈[总结复习用]
    spring boot配置文件application.propertis
    php危险的函数和类 disable_functions/class
  • 原文地址:https://www.cnblogs.com/g1215161797/p/11965507.html
Copyright © 2011-2022 走看看