• 指针


    day08-指针
    一、数据的地址
        使用‘&’可以获取数据的地址

        int a; ==>&a
        int b[5]; ==> b
        void test(void); ==> test 或 &test

    二、通过地址访问数据
        使用‘*’可以通过地址访问数据
        *(&a)

    三、指针变量
        int a = 250;
        int *p = &a;
        *p <==> *(&a) <==> a
        
        指针变量也是变量,指针的指向是可以修改的;
        只是它的内容不是值,而是地址。

        int a[5];
        int *p = a;
        p[i] <==> a[i]
        p+i <==> a+i <==> &a[i]
        *(p+i) <==> *(a+i) <==> a[i] <==> p[i]
        
        没有初始化的指针叫野指针,使用非常危险;
        若暂时不清楚用途,可初始化为NULL。

    四、void *指针
        通用指针,任意类型的指针
        int a = 250;
        void *p = &a;
        *((int *)p)
        通用指针不能直接取值,必须强制类型转换

    五、指针运算
            加减一个整数:加减的单位是其指向的数据类型的大小        两个指针相减:结果不是指针的数值差,
                                                        而是他们相差元素的个数。

    六、指针变量的大小
            指针变量的大小与其指向的数据类型无关,取决于OS

    七、const修饰的指针
            定义只读变量时必须要初始化,否则没有意义。
            

            1、const int *a; 和 int const *a;
            a的指向可以修改,a指向的内容不可修改
            2、int *const a;
            a的指向不可修改,a指向的内容可以修改
            3、const int * const a;
            a的指向不可修改,a指向的内容不可修改

            总结:const修饰谁,谁就不可改变

    八、复杂的指针
        1、声明字符串char *p = "abcd";
                指针指向的内容不能修改。
        2、二级指针(多级指针亦如此)
                int a = 250;
                int *p = &a;
                int **q = &p;
                *q <==> p <==> &a
                *(*q) <==> *p <==> *(&a) <==> a
                在使用中要清楚每个指针变量表示的意思。

        若想在函数中修改参数的值,必须传递变量的地址。

        3、函数指针,见18.c

    九、指针数组
        由指针变量构成的数组,其中每个元素都是指针变量

        int *a[5];
        char *b[5]  = {
                “123”,
                “456”,
                “abc”
        };

    char *p = “abcdefg”;
    char s[100];
    strcpy(s, p);
    strlen(s);
    strlen(strcpy(s, p)) //级联操作

    练习:
    1、求一个字符串的长度(strlen)

    #include<stdio.h>
    int lon(char *a)
    {
        int i=0;
        char *j=a;
        for(i=0;i<1024;i++)
        {
            a=a+1;
            if(*a=='')
            {
                return a-j;
            }
        }
    }
    int main()
    {
        int i;
        char a[1024]={};
        printf("输入: ");
        gets(a);
        i=lon(&a[0]);
        printf("%d ",i);
        return 0;
    }


    2、实现一个同strcpy函数功能相同的函数

    void fuzhi(char *a)
    {
        int i=0;
        char *j=a;
        char b[1024]={};
        for(i=0;i<1024;i++)
        {
            b[i]=*a;
            if(*a=='')
            {
                break;
            }
            a++;
        }
        int n=a-j;
        int m=0;
        for(m=0;m<n;m++)
        {
            printf("b[%d]=%c ",m,b[m]);
        }
    }
    int main()
    {
        char a[1024]={};
        printf("--输入-- ");
        gets(a);
        fuzhi(&a[0]);
        return 0;
    }
    3、实现两个函数分别实现数组元素的插入和删除

    void add(char *n,int a,char b)
    {
             int m=a;
            int q,p=10-a;    
            for(q=0;q<p;q++)
            {
                *(9+n-q)=*(9+n-q-1);
            }
            *(n+m)=b;
            printf("插入成功! ");
    }
    void less(char *n,int a,char b)
    {
        int q=a;
        for(;q<10;q++)
        {
            *(n+q-1)=*(n+q);
        }
        *(n+9)='';
        printf("删除成功! ");
    }
    int main()
    {
        char a[10]="abcdefghij";
        //add(&a[0],3,'A');
        less(&a[0],3,'c');
        int i;
        for(i=0;i<10;i++)
        {
            printf("%c ",a[i]);
        }
        printf(" ");
        return 0;
    }
    4、实现一个字符串压缩函数,压缩策略是将连续出现的字符转换成字符+次数的形式,如“abcccddeaaaaa”,压缩后变成“abc3d2ea5”;然后再编写一个解压函数。

    void yasuo(char *a,char *b)
    {
        int i,j=1,k=0;
        for(i=0;*(a+i)!='';i++)
        {
            if(*(a+i)!=*(a+i+1))
            {
                *(b+k)=*(a+i);
                if(j==1)
                {k++;}
                else
                {k=k+2;j=1;}
            }
            else
            {
                j++;
                *(b+k+1)=j+48;
            }
        }
    }
    void jieya(char *a,char *b)
    {
        int i,j=0,k=0;
        for(i=0;*(a+i)!='';i++)
        {
            if(*(a+i)>='a'&&*(a+i)<='z')
                    {
                        if(j!=0)
                        {k=k+j;j=0;}
                        else
                        {k++;}
                        *(b+k-1)=*(a+i);
                    }
            else
            {
                for(j=0;j<(*(a+i)-48)-1;j++)
                {
                    *(b+k)=*(b+k-1);
                    k++;
                }
            }
        }
    }
    void bianli(char *c)
    {
        int i;
        for(i=0;i<10;i++)
        {
            printf("%c",*(c+i));

        }
        printf(" ");
    }
    int main()
    {
        char a[10]="ab2s3df2";
        char b[10]="abbsssdff";
        char c[10];
        char d[10];
        yasuo(&b[0],&c[0]);
        jieya(&a[0],&d[0]);
        bianli(&c[0]);
        bianli(&d[0]);

        return 0;
    }


    5、仿照strcmp实现一个mystrcmp
    6、用自己实现的比较方法对字符指针数组进行排序
    7、利用命令行参数实现一个计算器。
            如:./a.out 30 + 50,打印:80






  • 相关阅读:
    leetcode简单刷题
    pycharm常用快捷键
    pycharm之black配置for python file(代码格式化工具)
    appium
    scheduleAtFixedRate 和 timer 执行对比
    Java 线程池创建的四种方式
    java 数据库连接池和普通连接 对比
    java 线程池 实现
    java 定时任务 Timer 范例
    java加载properties配置文件的几种方法
  • 原文地址:https://www.cnblogs.com/rainwz/p/4588994.html
Copyright © 2020-2023  润新知