zoukankan      html  css  js  c++  java
  • 1、指针(理解、使用)

    1.指针/指针变量的定义
      地址
        内存单元的编号
        从零开始的非负整数
        范围:4G【0~4G-1】
      指针/指针变量

        内存区的每一个字节都有一个编号,这就是“地址”
        指针的实质就是内存“地址”,指针就是地址,地址就是指针

        指针就是内存单元的编号
        指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量,指针和指针变量是两个不同的概念

        也可这样理解:

        编号(地址):内存中每一个字节分配一个号码
        定义一个变量,存放上面的号码,这样的变量叫做指针变量

        但是要注意:通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样。指针的本质就是一个操作受限的非负整数

    2、彻底理解C指针

      

    #include <stdio.h>
    
    void text02()
    {
        int num=100;
        //取变量的地址,用&
        //&num代表num的起始地址
        printf("%p
    ",&num);   //008FF9EC
    
        //需求:定义一个指针变量(系统会给这个变量开通4字节的空间),保存num的地址
        //在定义的时候:*p说明p是指针变量,而不是普通变量
    //int * p 等价于 int *p 也等价于 int* p
    int * p=NULL; printf("sizeof(p)=%d ",sizeof(p)); //sizeof(p)=4 //num的地址 与p 建立关系 p = &num; printf("num = %d ",num); //num=100 //在使用中:*p表示取p保存的地址对应空间里的内容 printf("*p = %d ",*p); //*p=100 } void test03() { int num = 10; //指针变量两种类型:自身的类型、指向的类型 //自身的类型:在指针变量定义的时候 将变量名拖黑 剩下啥类型 指针变量就是啥类型 //p自身的类型就是 int * //指向的类型:在指针变量定义的时候 将变量名和离它最近的一个*一起拖黑 剩下的啥类型 指针变量指向的就是啥类型 //p的指向类型是int //指针变量指向的类型的作用:决定了指针变量所取空间内容的宽度 决定了指针变量+1跳过的单位跨度 int *p = NULL; p = &num; //指针变量的跨度 //%u表示无符号的打印 printf("&num=%u ",&num); //&num=1638128 printf("p=%u ",p); //p=1638128 printf("p+1=%u ",p+1); // p+1=1638132 } void text04() { int num=0x01020304;//16进制中每两位代表一个字节 int *p1 = &num; printf("*p1 = %#x ",*p1); //*p1 = 0x1020304 //%#表示的输出提示方式,如果是8进制,在前面加0,如果是十进制,不加任何字符,如果是十六进制,会加上0x } int main(int argc,char *argv[]) { //text02(); //test03(); text04(); return 0; }

    3.指针常见错误

    # include <stdio.h>
    
    int main(void)
    {
        int i = 5;
        int * p;
        int * q;
    
        p = &i;
        //*p = i;//error  p没有指向
        //*q = p; //error 语法编译会出错,*q 为int类型,p为int * 类型
        //*q = *p;  //error
        p = q;  //q是垃圾值,q赋给p, p也变成垃圾值
        printf("%d
    ", *q);   //13行
            /*
                q的空间是属于本程序的,所以本程序可以读写q的内容, 
                但是如果q内部是垃圾值,则本程序不能读写*q的内容
                因为此时*q所代表的内存单元的控制权限并没有分配给本程序
                所以本程序运行到13行时就会立即出错
            */
        return 0;
    }

    4.经典指针程序--互换两个数字

    # include <stdio.h>
    
    void swap_1(int , int);
    void swap_2(int *, int *);
    void swap_3(int *, int *);
    
    int main(void)
    {
        int a = 3;
        int b = 5;
        
        swap_3(&a, &b); //swap_2(*p, *q); 是错误的, swap_2(a, b);也是错误的
        printf("a = %d, b = %d
    ", a, b);
    
        return 0;
    }
    
    //不能完成互换功能
    void swap_1(int a, int b)
    {
        int t;
    
        t = a;
        a = b;
        b = t;
    
        return;
    }
    
    //不能完成互换功能:这个函数相当于把ab的地址互换了,值没有互换
    void swap_2(int * p, int * q)//形参名是p和q,接受实参数的是p和q
    {
        int * t;//如果要互换p和q的值,则t必须是int *,不能是int,否则会出错
    
        t = p;
        p = q;
        q = t;
    }
    
    //可以完成互换功能
    void swap_3(int * p, int * q)  
    {
        int t; //如果要互换*p和*q的值, 则t必须定义成int,不能定义成int *, 否则语法出错
    
        t = *p;  //p是int *,  *p是int
        *p = *q;
        *q = t;
    }

    5、通过被调函数修改主调函数普通变量的值

      i) 实参必须为该普通变量的地址

      ii) 形参必须为指针变量

      iii) 在被调函数中通过 *形参名 = ... 的方式就可以修改主调函数相关变量的值

    # include <stdio.h>
    
    int f(int i, int j)
    {
        return 100;
    //    return 88;
    }
    
    void g(int * p, int * q)
    {
        *p = 1;
        *q = 2;
    }
    
    int main(void)
    {
        int a = 3, b = 5;
        g(&a, &b);
        printf("%d %d
    ", a, b);
        return 0;
    }

    补充:

    1.cpu和内存之间有三根主线:控制总线、数据总线、地址总线:32位

    2.*的含义:

    //1.乘法
    //2.定义指针变量
        int*p;// 定义了一个名字叫p的变量,int*表示p只能存放int变量的地址
    //3.指针运算符
      该运算符放在已经定义好的指针变量的前面
    如果p是一个已经定义好的指针变量
    则 *p 表示以p的内容为地址的变量
  • 相关阅读:
    使用mybatis报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, java.lang.String]
    mybatis报错 Error instantiating interface com.atguigu.mybatis.dao.DepartmentMapper with invalid types () or values ()
    报错Mapped Statements collection does not contain value for com.atguigu.mybatis.dao.EmployeeMapperPlus
    mybatis学习(2)
    resultType没有指定就会报错
    使用Mybatis时报错Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
    Oracle操作ORA-02289: 序列不存在
    在数据库中添加数据以后,使用Mybatis进行查询结果为空
    program
    codevs4817 江哥的dp题d
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12638575.html
Copyright © 2011-2022 走看看