• C博客作业05-指针


    C博客作业05-指针

    这个作业属于哪个班级 C语言--网络2011/2012
    这个作业的地址 C博客作业05--指针
    这个作业的目标 学习指针相关内容
    姓名 姚庆荣

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

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

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

    指针定义:

    指针是一种类型,被称为“指针类型”。指针类型描述的是一个地址,这个地址指向内存中另外一个对象的位置。(一般以变量所在的内存单元的第一个字节的地址作为指针的地址。

    指针运算:

    • 1)取地址运算和间接访问运算:(指针类型与所指变量的类型必须一致)
    int *p, a = 3;
    p =&a;
    

    间接访问改变指针所指的变量

    int a =1, x, *p;
    p = &a;
    x = *p++;
    

    指针p先指向常量a,后将常量a赋值给x,并改变指针的值,使指针p不指向a;

    • 2)指针相关运算:
    定义 运算类型
    *(p)++ 指针所指内容+1
    ++*p 指针所指的数值+1
    p++ 指针向后移动一位

    指针做函数参数:

    若某变量的地址作为函数的实参,对应的形参就是指针。

    void printf(int *a, int *b)//指针作为形参
    int a = 3;
    int *b;
    b = &a;
    

    1.2 字符指针

    指针指向字符串:

    • 定义字符指针:char *p;
    • 内容为字符串,同字符数组;
    • 输出字符指针的内容:printf("%s",p);
    • p指向字符串的首地址;

    字符串相关函数及用法:

    函数名 函数格式 函数作用
    #include<string.h> #include<string.h> 调用函数的声明
    strlen strlen(a) 计算字符串的长度
    strcpy strcpy(a, b) 把b字符串内容赋给a字符串
    strcat strcat(a, b) 连接a,b2个字符串
    strcmp strcmp(a,b) 比较两个字符串的大小,(a大为1,b大为-1,相等时为0)
    strstr strstr(a, b) 找第二个字符串在第一个字符串的出现的第一个地址
    malloc a = (char)malloc(msizeof(char)) 动态申请,结束后释放内存

    1.3 指针做函数返回值

    • 指针在函数内无返回值时应return 0(return NULL)。
    • 指针在不同定义类型的函数内的返回值必须与实参保持一致。
    • 指针作为函数的返回值时可返回多个值。

    1.4 动态内存分配

    • 动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存。

    • 以前所写的程序大多数都是在栈上分配的,比如局部变量、形参、函数调用等。栈上分配的内存是由系统分配和释放的,空间有限,在复合语句或函数运行结束后就会被系统自动释放。而堆上分配的内存是由程序员通过编程自己手动分配和释放的,空间很大,存储自由。

    • malloc 函数

    void *malloc(unsigned int size);

    其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。如:

    malloc(100);/*开辟 100 个字节的临时分配域,返回值为其第一个字节的地址*/(注:指针的基类型为 void,即不指向任何类型的数据,只提供一个地址。如果此函数未能成功的执行(例如内存空间不足),则返回空指针(NULL)。)

    • calloc函数

    void *calloc(unsigned n, unsigned size)

    其作用是在内存的动态存储区中分配n个长度为 size 的连续空间。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL。

    采用 calloc 函数可以为一维数组开辟动态存储空间,n 为数组元素个数,每个元素长度为 size,这就是动态数组。如:

    p = calloc(50,4) /*开辟 50*4个字节的临时分配域,把起始地址赋给指针变量p */

    • free 函数

    void free(void*p);

    其作用是释放指针 p 所指向的动态空间,使这部分空间能被其他变量使用。p 是最近一次调用 calloc 或malloc 函数时的返回值。free函数无返回值。如:

    free(p); /*释放指针变量p指向的已分配的动态空间*/

    1.5 指针数组及其应用

    int a[10][10];
    for(int i=0;i<10;i++) 
    scanf("%s",a[0]); //二维数组表示
    
    char *p[10];
    int i=0; 
    for(;i<10;i++)
    {
    p[i]=(char*)malloc(1024); 
    scanf("%s",p[i]);  //用指针数组表示 
    }
    

    1.6 二级指针

    • 是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据指向指针变量的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
      简单来说就是存储一级指针地址的地址。

    1.7 行指针、列指针

    定义:

    • 行指针:指向某一行,不指向具体的元素。

    • 列指针:指向行中具体的元素

    用法:

    元素a[1][2],列指针表示为a[1]+2,等价表示为(a+1)+2,那么内容是(*(a+1)+2);

    2.PTA实验作业(7分)

    2.1 查找子串(2分)

    2.1.1 伪代码

    slen = strlen(s);
    tlen = strlen(t);
    for(i=0 to slen)
        j=i;
        while(s[j]==t[k])
        k++;j++;
        end while
        if(k>=tlen)
        p=&s[i]; return 0;
        end if
        k=0;
    end for
    return 0;
    
    

    2.1.2 代码截图

    2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。

    char *search(char *s, char *t)
    {
      int lens=strlen(s);
      int lent=strlen(t);
      int i,j,k;
      int x=lens-lent;
      for (i=0; i<=x; i++)
      {
        for (j=0,k=i; j<lent; j++,k++)
        {
          if (s[k]!=t[j]) break;
        }
        if (j==lent)
          break;
      }
      if (i<=x) return s+i;
      else return NULL;
    }
    
    • 区别:我的代码将两个数组中数的对比放在循环条件,而同学代码放在循环体中,自我感觉作为条件判断更易让人看懂。

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

    2.2.1 伪代码

    void merge(int* a, int m, int* b, int n)
    {
    申请动态内存
    for (k=0;i<m&&j<n;k++)
         if(ab两个数组的首地址比大小,小的放进c数组然后对应数组下标加一)
         end if
    end for
    if(一组数组赋值到c数组结束,剩下的位置用另一个数组赋值)
    end if
    for (i = 0; i < k; i++)
    a[i] = c[i];
    }
    

    2.2.2 代码截图

    2.2.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。

    区别:我的代码缺少的注释,不易看懂,且套用两层循环,增大了计算量。

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

    2.3.1 伪代码

    输入数组并计算长度
    for (i = len - 1 to 0 )
        if (数组不为空格也不为换行符)
            记录单词最后一位字母位置
            for (j = i - 1 to 0 )
                if数组等于空格; break
                end if
            end for
            记录单词第一个字母位置
            if不是遍历的第一个单词   输出空格
            end if
            for (k = first to last )
                 输出字母
            end for
            继续遍历
        end if
    end for
    

    2.3.2 代码截图

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

    • 借鉴了超星视频上的代码,与视频中代码查不多,真就不会写。
  • 相关阅读:
    圆周率的计算与进度条
    Python的使用方法
    Python科学计算库
    linux 命令总结[转]
    如何在 Windows 平台上下載 Android 的源码[转]
    装MSN报错问题解决 无法定位程序输入点except handler4 common 于动态链接库nsvcrt.dll【转】
    编写xorg.conf,简单三行解决ubuntu分辩率不可调的问题【转】
    谁说 Android 手机一定要 root 权限才能截屏?![转]
    给自己的忠告[转]
    lockdir加密bug[转]
  • 原文地址:https://www.cnblogs.com/yqr2012/p/14199376.html
Copyright © 2020-2023  润新知