• c语言学习之基础知识点介绍(十四):指针的进阶


    一、指针的加、减法运算

    /*
    1、加法运算
            1)、可以跟整数进行加法运算,得到的还是一个地址
                公式:
                     地址 + 1 = 地址 + 1 * 类型所占的字节数
                     地址 + n = 地址 + n * 类型所占的字节数
            2)、只能跟整数运算,不能跟浮点数运算
    
    
     2、指针的减法运算:
            1)、可以跟整数进行减法运算,得到的还是一个地址
     
                公式:
                     地址 - 1 = 地址 - 1 * 类型所占的字节数
                     
                     地址 - n = 地址 - n * 类型所占的字节数
     
            2)、只能跟整数运算,不能跟浮点数运算
    
    */
    //例如:
        //int类型的指针+1,结果等于原地址+4个字节
        //0x7fff5fbff7cc  -  0x7fff5fbff7d0
        /*
        int num = 10;
        int *pNum = #//变量名是pNum  类型是int *
        printf("%p
    ",pNum);//0x7fff5fbff7cc
        printf("%p
    ",pNum+1); //0x7fff5fbff7d0
        */
        
        //char类型的指针+1,结果等于原地址+1个字节
        //0x7fff5fbff7cf  -  0x7fff5fbff7d0
        /*
        char ch = 'a';
        char *pCh = &ch;
        printf("%p
    ",pCh);//0x7fff5fbff7cf
        printf("%p
    ",pCh + 1);//0x7fff5fbff7d0
        */
        
        //float类型的指针+1,结果等于原地址+4个字节
        //0x7fff5fbff7cc  -  0x7fff5fbff7d0
        /*
        float f = 10.3f;
        float *p = &f;
        printf("%p
    ",p); //0x7fff5fbff7cc
        printf("%p
    ",p+1);//0x7fff5fbff7d0
        */
        
        
        //double类型的指针+1,结果等于原地址+8个字节
        //0x7fff5fbff7c8  -  0x7fff5fbff7d0
        /*
        double d = 10.3;
        double *p = &d;
        printf("%p
    ",p); //0x7fff5fbff7c8
        
        printf("%p
    ",p+1);//0x7fff5fbff7d0
        */
        
        //long类型的指针+1,结果等于原地址+8个字节
        //0x7fff5fbff7c8  -  0x7fff5fbff7d0
        /*
        long num = 10l;
        long *p = #
        printf("%p
    ",p);//0x7fff5fbff7c8
        printf("%p
    ",p+1);//0x7fff5fbff7d0
        */
    
        //指针只能跟整数运算,不能跟浮点数运算
        /*
        int num = 10;
        int *p = #
        printf("%p
    ",p+1.0); //报错
        */

    二、指针加减法的作用

    /*
    指针跟整数的加法和减法都可以用来遍历数组
    加法:
         int nums[3] = {10,20,30};
         int *p = &nums[0];
         for (int i = 0; i<3; i++) {
             printf("%d
    ",*(p+i));
         }
     
    减法:
         int nums[3] = {10,20,30};
         int *p = &nums[2];
         for (int i = 0; i<3; i++) {
             printf("%d
    ",*(p-i));
         }
    */

    三、指针和指针的运算

    /*
    指针可以和指针进行运算,但是只能进行减法运算。
            指针和指针的减法运算,结果是一个long类型。
             a.指针跟指针之间只能做减法运算,加、乘、除、取余都不可以。
             b.指针跟指针之间的运算结果是一个整数,而且是long类型的。
             c.指针跟指针之间的运算,必须是相同类型的指针,否则报错。
     
    作用:指针的减法运算,只要是为了计算两个地址之间,相差了几个位(几个相同类型的空间)
    
            公式:
                地址 - 地址  = (地址 - 地址)/ 类型所占字节数
    */
    //例如:
        int num1=10,num2=20,*p1 = &num1,*p2 = &num2;
        printf("%ld
    ",p1-p2);//1

    四:指针运算的注意事项

    /*
     注意:
        指针和整数,不能相数
        指针和整数,不能相除
        指针和整数,不能取余
    加法和减法都不能和浮点数进行运算。
    
    */

    五、指针函数的介绍

    /*
     指针函数:
            其实应该在中间加一个的字。叫 指针的函数,本质上还是一个函数。
     
            当函数的返回值是一个指针的时候,就叫指针函数。
     
     
     定义语法:
            类型 * 函数名(参数列表){
     
                函数体;
            }
     
        注意:这个*可以放在类型和函数名中间的任意位置。
     
     内存中有一个地方叫栈区,栈区里面放的是局部变量。
     
     有一个特点:出了作用域,就会回收。
     
     
        注意:用指针函数的话,目前没什么用,C语言中的数据类型只要是局部的都是存在栈里面的。
     
     
             用处的话:只能返回全局变量或者返回字符串常量,还可以返回静态变量的地址。
    
    */
    #include <stdio.h>
    
    int qNum = 111;
    
    int *test(){ //函数名是test 返回值是int *
      
    //    int num = 1;
        
    //    int *p = &num;
        
    //    return &num;
        
        return &qNum;
    }
    
    
    char *test2(){
        
        char *str = "qwe";
        
        return str;
    }
    
    int main(int argc, const char * argv[]) {
        
        /*
        int *p = test();
        
        int nums[100] = {0};
        
        printf("%d
    ",*p);
        */
        
        
        char *str = test2();
        
        printf("%s
    ",str);
        
        return 0;
    }

    函数的指针将在下一篇介绍。

  • 相关阅读:
    fort循环
    while
    函数和数组
    case
    init进程
    权限安全:堡垒机部署实践
    tcp首部当中seq和ack的增长规律
    VRRP
    MSTP
    字符集专题
  • 原文地址:https://www.cnblogs.com/bobo-pcb/p/4936440.html
Copyright © 2020-2023  润新知