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

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

    0.展示PTA总分

    1.本章学习总结

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

    1.1.1 指针的定义:

    指针就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。

    //类型 *变量标识符;
    int *p;
    //其中:p是一个指向整型变量的指针变量
    
    //定义普通变量
    float a = 99.5, b = 10.6;
    char c = '@', d = '#';
    //定义指针变量
    float *p1 = &a;
    char *p2 = &c;
    //修改指针变量的值
    p1 = &b;
    p2 = &d;
    

    使用指针变量之前一定要初始化,对于暂时没有指向的指针,建议赋值NULL。

    1.1.2 指针的相关运算

    ·指针能进行算术运算,包括:+,-,++,--,+=,-=。
    ·指针的关系运算:
    1)指针变量保存的地址值比较

    #include <stdio.h>
    void main 
    {
        float fl[6];
        float *p = f1,*p2 = &f1[2];
        printf("p1==f1:%d
    ",p1==f1);
        printf("p2>p1:%d
    ",p2>p1);
    }
    

    2)指针变量所指向的变量值的关系运算

    #include <stdio.h>
    void main
    {
        int a[]={1,2,3,4,5,6,7,8};
        int *p,*q;
        q = a;
        q = &a[3];
        printf("*p == *q:%d
    ",*p==*q);
    }
    

    两个指针变量可以相减。如果两个指针变量指向同一个数组中的某个元素,那么相减的结果就是两个指针之间相差的元素个数。

    1.1.3 指针做函数参数

    用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。

    #include <stdio.h>
    void swap(int *p1, int *p2){
        int temp;  //临时变量
        temp = *p1;
        *p1 = *p2;
        *p2 = temp;
    }
    int main(){
        int a = 66, b = 99;
        swap(&a, &b);
        printf("a = %d, b = %d
    ", a, b);
        return 0;
    }
    
    运行结果:
    a = 99, b = 66
    

    调用 swap() 函数时,将变量 a、b 的地址分别赋值给 p1、p2,这样 p1、p2 代表的就是变量 a、b 本身,交换 p1、p2 的值也就是交换 a、b 的值。函数运行结束后虽然会将 p1、p2 销毁,但它对外部 a、b 造成的影响是“持久化”的,不会随着函数的结束而“恢复原样”。

    1.2字符指针

    ·字符指针初始化

    char *str = "Welcome";
    或
    char a[] ="Welcome";
    char *str;
    str = a;
    

    ·字符串操作函数

    strcpy(str1,str2):将字符串str2复制到字符串str1中,并覆盖str1原始字符串,可以用来为字符串变量赋值
    strcmp(str1,str2);比较两个字符串,如果两个字符串相等,则返回0;若str1大于str2,返回一个正数(这个正数不一定是1);若str1小于str2,返回一个负数(不一定是-1)
    strcat(str1,str2):将字符串str2添加到字符串str1的尾部,也就是拼接两个字符串
    strlen(str1):计算字符串str1的长度,字符串的长度不包括字符''

    1.3指针做函数返回值

    ·C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。
    ·函数返回值必须用同类型的变量。
    ·用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据

    1.4动态内存分配

    相关函数用法

    1.malloc()函数
    函数声明:

    void *malloc(size_t size)
    

    malloc分配的内存大小至少为size参数所指定的字节数
    malloc的返回值是一个指针,指向一段可用内存的起始地址
    多次调用malloc所分配的地址不能有重叠部分,除非某次malloc所分配的地址被释放掉
    malloc应该尽快完成内存分配并返回,该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。
    实现malloc时应同时实现内存大小调整和内存释放函数(realloc和free)
    2.calloc()函数:
    函数声明:

    void * calloc (size_t num, size_t size);
    

    作用:用来动态地分配内存空间并初始化为 0
    calloc() 与 malloc() 的一个重要区别是:calloc() 在动态分配完内存后,自动初始化该内存空间为零,而 malloc() 不初始化,里边数据是未知的垃圾数据。
    3.free()函数:
    函数声明:

    void free(void *ptr)
    

    作用:free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。

    1.5指针数组及其应用

    指针数组:里面的元素全部都是指针。

    char *p[]={"China","America","Russia","Australia"};
    //这四个指针变量保存了4个字符串的起始位置的地址。
    

    多个字符串用二维数组表示和用指针数组表示区别?
    我们可以借助指针来访问二维数组,虽然相比使用数组形式访问繁琐点,但通过这个过程可以让我们对二维数组的构成更加清晰明了。
    在字符串数组的初始化上显然更建议用指针数组来进行初始化,这样能更好地利用内存空间。
    但在访问字符串数组(或者其他二维数组)上,用数组形式更加简洁、清晰。

    1.6二级指针

    指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。如果一个指针指向的是另外一个指针,我们就称它为二级指针,即指向指针的指针。

    假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:

    即:

    int a =100;
    int *p1 = &a;
    int **p2 = &p1;
    

    1.7行指针、列指针

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

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

    //示例1:用列指针输出二维数组。
    #include <stdio.h>
    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:用行指针输出整个二维数组。
    #include <stdio.h>
    void main()
    {
       int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
       int (*p)[4]= &a[0]; // 行指针定义法
       int i, j;
    
       for(i = 0; i < 3; i++)
    
         for(j = 0; j < 4; j++)
       {
         printf("%d ",*(*(p + i) + j));
       }
        return;
    }
    

    2.PTA实验作业

    2.17-3 字符串的冒泡排序

    代码截图:

    2.2合并2个有序数组

    2.3说反话-加强版

    代码截图:


  • 相关阅读:
    【JOB】Oracle中JOB的创建方法以及一个细节的探究
    PHP安装加载yaf扩展
    微信开发(1) -- 将本地开发环境映射到公网访问
    修改Nginx与Apache上传文件大小限制
    liunx系统安装composer与配置
    Mysql 5.7 liunx 忘记密码的补救方法
    Vim使用技巧(4) -- 命令行模式 【持续更新】
    Vim使用技巧(3) -- 可视化模式技巧 【持续更新】
    Vim使用技巧(2) -- 插入模式技巧 【持续更新】
    Postman 安装及使用入门教程
  • 原文地址:https://www.cnblogs.com/SONGminusone/p/14198666.html
Copyright © 2011-2022 走看看