美文网首页
C语言-指针入门与基本数据类型

C语言-指针入门与基本数据类型

作者: 大虾啊啊啊 | 来源:发表于2022-07-27 10:38 被阅读0次

    1、基本数据类型

    void baseDataType() {
        int i = 100;
        double d = 200;
        float f = 200;
        long l = 100;
        short s = 100;
        char c = 'd';
        // 字符串
        char *str = "daxiaaaaaa";
        // 不是随便打印的,需要占位
        printf("i的值是:%d,int所占字节:%d\n", i,sizeof i); // d == 整形
        printf("d的值是:%lf,double所占字节:%d\n", d,sizeof d); // lf == long float
        printf("f的值是:%f,float所占字节:%d\n", f,sizeof f); // f == float
        printf("l的值是:%d,long:%d\n", l,sizeof l); // d == 整形
        printf("s的值是:%d,short:%d\n", s,sizeof s); // s == short
        printf("c的值是:%c,char所占字节:%d\n", c,sizeof c); // c == char
        printf("字符串:%s\n", str); // s == String
    }
    
    i的值是:100,int所占字节:4
    d的值是:200.000000,double所占字节:8
    f的值是:200.000000,float所占字节:4
    l的值是:100,long:4
    s的值是:100,short:2
    c的值是:d,char所占字节:1
    字符串:daxiaaaaaa
    

    2、指针

    指针用于存放内存地址
    &a,表示取a的地址,int * a,表示int类型的指针变量a,可以用于存放a的地址。*a表示取出指针变量对应地址所存放的值,也就100.

      int a = 100;
      int b = 200;
       change(&a, &b);
    /**
    * 交换数据
    * @param a  指针a
    * @param b  指针b
    */
    void change(int *a, int *b) {
      int temp = *b;
      *b = *a;
      *a = temp;
    }
    
    

    3、多级指针

    一级指针存放number的地址,二级指针p2存放一级指针p1的地址,三级指针p3存放二级指针p2的地址

    /**
     * 多级指针
     */
    void pointer() {
        int number = 999;
        //一级指针存放number的地址
        int *p1 = &number;
        //二级指针p2存放一级指针p1的地址
        int **p2 = &p1;
        //三级指针p3存放二级指针p3的地址
        int ****p3 = &p2;
        printf("通过三级指针取值 %d", ***p3);
    }
    
    

    4、数组与数组指针

    
    /**
     * 数组与数组指针
     */
    void pointerArray() {
        //数组普通使用
        int aar[] = {1, 2, 3, 4, 5, 6, 7};
        int i = 0;
        for (; i < sizeof aar / sizeof(int); i++) {
            printf("value is %d\n", aar[i]);
        }
        //数组与指针的关系
        printf("aar = %d\n", aar);
        printf("&aar[0] = %d\n", &aar[0]);
        printf("&aar= %d\n", &aar);
        printf("*aar= %d\n", *aar);
    
    }
    
    
    
    value is 1
    value is 2
    value is 3
    value is 4
    value is 5
    value is 6
    value is 7
    aar = 643823296
    &aar[0] = 643823296
    &aar= 643823296
    *aar= 1
    

    aar 和&aar[0]和&aar的值都为643823296,意思它们都表示数组的头指针,也就是存放数组第0位数据的地址。因此*aar表示指针aar对应地址所存放的值,也就是数组第0位的值。直观的理解就是aar作为指针指向了数组的第0位。

    5、数组指针的使用

    • 指针挪动
      aar表示头指针,aar赋给aarP,aarP挪动了一位,因此打印*aarP的结果为2
        int aar[] = {1, 2, 3, 4};
        int *aarP = aar;
        aarP++;
        printf("value = %d", *aarP);
    
    • 使用指针遍历数组
        int aar[4];
        for (int j = 0; j < 4; ++j) {
            //通过挪动指针方式遍历赋值
            *(aar + j) = j;
        }
        for (int i = 0; i < 4; ++i) {
            //通过挪动指针方式遍历
            printf("value = %d\n", *(aar + i));
        }
        for (int i = 0; i < 4; ++i) {
            //普通方式遍历
            printf("value = %d\n", aar[i]);
        }
    

    6、函数指针

    可以定义函数指针,把指针传入到另外一个函数,有点类似java的接口回调,kt的高阶函数

        //定义函数指针 p
        void (*p)(char *, int, int);
        //函数指针p 指向 callBack 这个函数
        p = &callBack;
        //调用downLoad函数,传入函数指针
        downLoad(p, "derry.png");
       // downLoad(callBack,"daxiaa.png");
    
    /**
     * 回调函数
     * @param fileName
     * @param current
     * @param total
     */
    void callBack(char *fileName, int current, int total) {
        printf("%s的下载进度为:%d/%d", fileName, current, total);
    
    }
    
    /**
     * ]
     * @param p  函数指针
     * @param fileName  文件名字
     */
    void downLoad(void(*p)(char *, int, int), char *fileName) {
        p(fileName, 5, 10);
    }
    
    daxia.png的下载进度为:5/10
    

    7、字符串与指针

    • 字符串声明的两种方式
      第一种方式,数据存放在栈空间,可以修改里面的值
      第二种方式,数据存放在全局区,不能修改
        char str[] = {'D', 'e', 'r', 'r', 'y', '\0'};
        str[2] = 'z'; // 这里能修改,数据存放在栈空间
        printf("第一种方式:%s\n", str); // printf 必须遇到 \0 才结束
    
        char * str2 = "Derry"; // 隐士  Derry+\0
        str2[2] = 'z'; // 会奔溃,为什么,不允许访问,这种方式,数据存放在全局区,不能修改
        printf("第二种方式:%s\n", str2);
    
    • 字符串与指针的操作
      通过指针挪动,对每一位字符小写转换,并且在lower函数中,定义了临时指针temp ,避免破坏传进来的的指针name。
    // 指针的理解
        char * name = "daXXiaAa";
    
        // 先定义结果
        char dest[20];
        lower(dest, name);
        printf("小写转换后的结构是:%s\n", dest);
    
    
    void lower(char * dest, char * name) {
        char * temp = name; // 临时指针,你只能操作,临时指针,不能破坏name指针
        while (*temp) {
            *dest = tolower(*temp);
            temp ++; // 挪动指针位置 ++
            dest ++; // 挪动指针位置 ++  目的是为了 挪动一个存储一个 挪动一个存储一个 ...
        }
        // printf '\0'
        *dest = '\0'; // 避免printf打印系统值
    
        printf("不能破坏 name:%s\n", name); // temp的好处就是,不会破坏name
    }
    
    不能破坏 name:daXXiaAa
    小写转换后的结构是:daxxiaaa
    
    • 字符串拷贝
      使用strcpy拷贝函数
    int main() {
        char *str ="daxoiaaa";
        char *copy;
        strcpy(copy,str);
        printf(" value is%s",copy);
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C语言-指针入门与基本数据类型

          本文链接:https://www.haomeiwen.com/subject/mktzirtx.html