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

    0.展示PTA总分(0----2)
    展示关于“指针题目集”分数截图。

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

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

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

    1.1.1指针定义

    定义指针变量的一般形式为:*类型名 指针变量名;

    int *p;
    

    在定义指针变量时,要注意以下几点。

    1. 指针变量名是一个标识符,要按照C标识符的命名规则对指针变量进行命名。
    2. 指针变量的数据类型是它所指向的变量的类型,一般情况下一旦指针变量的类型被确定后,他只能指向同种类型的变量。
    3. 在定义指针变量时需要使用指针声明符 * ,但指针声明符并不是指针的组成部分。例如:定义int p;说明p是指针变量,而不是p;

    1.1.2指针相关运算

    1. 取地址运算
    int *p, a = 3;
    p = &a;
    

    将整型变量a的地址赋给整型指针p,使指针p指向变量a。也就是说,用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a。
    表达式*p = p + 1、++p和(p)++,都是将指针p所指向变量的值加1。而表达式p++等价于(p++),先取p的值作为表达式的值,在将指针p的值加1,运算后,p不再指向变量a。
    2. 赋值运算

    int a = 3, *p1, *p2;	/* 定义整型变量指针p1和p2 */
    p1 = &a;		/* 使指针p1指向整型变量a */
    p2 = p1;
    

    1.1.3指针做函数参数

    void merge(int* a, int m, int* b, int n);
    

    1.2 字符指针

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

    char * x = "abcd"; //声明一个字符类型的指针x 指向一个字符串
    

    1、指针类型为char ,指针的类型决定了这个指针指向数据的类型;

    2、指针变量 x 自身是有变量地址的,也就是说 x 变量作为一个变量,有自己的内存地址。
    那么,这里的赋值语句可以理解为 指针变量x的内存地址上存储了一个字符类型的地址。

    1.3 指针做函数返回值

    具体格式是什么,注意事项。
    1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改);
    2、使用栈内存返回指针是明显错误的,因为栈内存将在调用结束后自动释放,从而主函数使用该地址空间将很危险。

    1.4 动态内存分配

    为什么要动态内存分配,堆区和栈区区别。动态内存分配相关函数及用法。举例为多个字符串做动态内存要如何分配。
    栈区(stack): 函数运行时分配,函数结束时释放。由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
    堆区(heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。
    动态内存分配中的free()是释放的意思
    释放是修改了申请的内存的使用状态,从可用变成不可用,里面的数据还在,但是使用权已经交还给系统

    int *p = malloc(sizeof(int) * 10);
    free(p);
    free(p);
    
    • 当我们对同一块内存进行多次释放的时候,会造成系统的崩溃,这种情况是过度释放造成的.
    • malloc申请内存之后,内存使用完,就free,这两个是成对出现的
    • 当对一段内存free之后,根据地址还可以访问这段内存,但是内存的所属权已经不在我们手里,会出现崩溃的可能,这种情况称为野指针
    • 野指针,过度释放和内存泄漏是常见的三种内存问题.编程时要多注意.

    1.5 指针数组及其应用

    定义 :char *p[n];
    这是一个p数组,数组元素包括p[0]、p[1]、p[2]...p[n-1],分别用来存放一个指针地址,而这些地址指向的是一个char型的字符。
    可以将二维数组赋给一指针数组:

    char *p[3];//此数组每一个元素都是一个指针
    char a[3][4];
    for(int i=0;i<3;i++)
    {
        p[i]=a[i];
    }
    

    这里char *p[3] 表示一个一维数组内存放着三个指针变量p[0]、p[1]、p[2],分别指向a[0],a[[1],a[2]所在的行

    1.6 二级指针

    二级指针:指向指针的指针。

    一级指针与二级指针的比较:一级指针的值为地址,地址需要空间来存放,是空间就具有地址
    ,二级指针就是为了获取这一空间的地址。一级指针所关联的是其值(一个地址)名下空间里
    的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个
    用途,就是地址。

    指针的用途:提供目标的读取或改写,而二级指针就是对于内存地址的读取和改写。

    二级指针分为指向指针变量的指针和指向数组的指针。
    例:

    int main()
    {
    int k,*p,**pp;
    k=8;
    p=&k;
    pp=&p;
    printf(“k=%d,p=%d,p=%d
    ”,**pp,*pp,p);
    return 0;
    }
    

    1.7 行指针、列指针

    定义格式、主要用法。

     int *ptr=*a;
    

    行指针:指的是一整行,不指向具体元素。

    列指针:指的是一行中某个具体元素。

    可以将列指针理解为行指针的具体元素,行指针理解为列指针的地址。

    那么两个概念之间的具体转换是:

    *行指针----列指针

    &列指针----行指针
    例:用列指针输出二维数组。

    #include
    
    void main()
    
    {
    
       int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    
       int *p= a[0];   // 列指针的定义法
    
     
    
       for(; p < a[0] + 12; p++)
    
       {
    
         printf("%d ",*p);
    
       }
    
      
    
        return;
    
    }
    

    2.PTA实验作业(7分)

    2.1 藏尾诗(2分)

    2.1.2 代码截图

    贴图展示代码,不要复制。

    2.2 合并2个有序数组(2分)

    选择合并2个有序数组这题介绍做法。

    2.2.2 代码截图

    2.3 说反话-加强版(3分)

    选择说反话-加强版这题介绍字符指针操作如何操作字符串。并说明和超星视频做法区别。

    2.3.2 代码截图

  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/letmee/p/14199337.html
Copyright © 2011-2022 走看看