云计算百科
云计算领域专业知识百科平台

华清远见25072班C语言学习day8

重点内容:

指针:

        其他类型不能存储内存地址,而指针可以存储内存地址

定义:

        数据类型 *指针名;

指针的初始化和赋值:

        int *p; –>定义了一个int*类型的指针p但是没有初始化是一个野指针

        int *p1 = &a; //定义了一个int *类型的指针,用a的地址给指针初始化

        int *p2 = NULL; //将指针初始化为空指针

        p = &a; //p1和p都指向变量a(都保存变量a的地址)

指针和变量的关系:

        指针保存变量的首地址,就称为指针指向该变量

        变量有变量的地址,指针也有自己的地址

        指针指向变量只能指向变量的首地址

通过指针间接访问变量:

        只有通过变量名访问才是直接访问

        指针:  *地址 —–> 获取到该地址中的值

指针涉及到的两个运算符:

        *: 1、乘法运算 2、定义指针变量 3、间接访问地址中的值

                区分2和3:观察*前面是否有数据类型

        &: 1、按位与 2、取地址

指针的大小:

        指针变量的大小是固定的: 64位操作系统占8Byte,32位操作系统占4Byte

指针数据类型的作用:

        决定了指针的偏移量,指针一次可以操作的空间

        指针变量的数据类型和指向数据的数据类型指针

指针之间的强制类型转换:

        指针之间数据类型的强转是安全的,指针之间的强转只改变指针可以操作的空间

大小端存储:

        大端存储:数据高位存在地址低位(网络通信传数据)

        小端存储:数据低位存在地址低位(大部分的计算机都是小端存储)

        测试大小端存储时,注意数据的高数据位和低数据位要不相同

指针的运算:

        指针本质上是内存地址的编号

        大部分运算对指针没有意义

        常用:算数加减法、自增、比较

特殊的指针:

  • 野指针:不明确指向的指针(间接访问可能会段错误,可能随机值)
  • 空指针:int *p = NULL; (间接访问一定会段错误)
  • 万能指针:void * (可以强转成任意类型)
  • 指针和一维整形数组结合:

            前面对于数组中元素的访问,实际上就是通过数组中元素的地址进行访问

            数组名本身是数组中首元素的地址

    指针和一维字符数组结合:

            和指针指向一维整形数组除数据类型外,都一致


    作业:

    1.用指针和一维整形数组结合,完成冒泡排序和选择排序

    程序源码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, const char *argv[])
    {
        int arr[10];
        printf("please enter arr:");
        int len=sizeof(arr)/sizeof(arr[0]);
        for(int i=0;i<len;i++)
        {
            scanf("%d",&arr[i]);
        }
        int *p=arr;
        for(int i=1;i<len;i++)
        {
            for(int j=0;j<len-i;j++)
            {
                if(p[j]>p[j+1])
                {
                    int temp=p[j];
                    p[j]=p[j+1];
                    p[j+1]=temp;
                }
            }
        }
        for(int i=0;i<len;i++)
        {
            printf("%d\\t",arr[i]);
        }
        putchar(10);
        int *q=arr;
        for(int i=1;i<len;i++)
        {
            int max_index=i-1;
            for(int j=i;j<len;j++)
            {
                if(q[max_index]<q[j])
                {
                    max_index=j;
                }
            }
            if(max_index!=i-1)
            {
                int temp=q[max_index];
                q[max_index]=q[i-1];
                q[i-1]=temp;

            }
        }
        for(int i=0;i<len;i++)
        {
            printf("%d\\t",arr[i]);
        }
        putchar(10);

        return 0;
    }
     

    2.用指针实现strcpy函数、strcat、strcmp函数

    strcpy函数:

    程序源码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, const char *argv[])
    {
        char arr1[20]="welcome to ";
        char arr2[20]="hqyj";
        char *p1=arr1;
        char *p2=arr2;

        while(*p2)
        {
            *p1=*p2;
            p2++;
            p1++;
        }
        *p1=*p2;
        puts(arr1);
        return 0;
    }
     

    strcat函数:

    程序源码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, const char *argv[])
    {
        char arr1[20]="welcome to ";
        char arr2[20]="hqyj";
        char *p1=arr1;
        char *p2=arr2;
        while(*p1)
        {
            p1++;
        }
        while(*p2)
        {
            *p1=*p2;
            p1++;
            p2++;
        }
        *p1=*p2;
        puts(arr1);
        return 0;
    }

    strcmp函数:

    程序源码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, const char *argv[])
    {
        char arr1[20]="welcome to ";
        char arr2[20]="hqyj";
        char *p1=arr1;
        char *p2=arr2;
        while(*p1&&*p1==*p2)
        {
            p1++;
            p2++;
        }
        if(*p1-*p2>0)
            printf("p1>p2\\n");
        else if(*p1-*p2<0)
            printf("p1<p2\\n");
        else
            printf("p1==p2\\n");
        return 0;
    }

    3.终端输入带空格的字符串,用指针的方式删除字符串中的空格

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, const char *argv[])
    {
        char arr[15];
        printf("请输入字符串:");
        gets(arr);
        char *p=arr;
        char *q=arr;
        while(*p)
        {
            if(*p!=' ')
            {
                *q=*p;
                q++;
            }
            p++;
        }
        *q='\\0';
        printf("删除空格后的字符串:");
        puts(arr);
        return 0;
    }

    4.思维导图

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 华清远见25072班C语言学习day8
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!