zoukankan      html  css  js  c++  java
  • C:指针

    指针

    指针数组   参考1   参考2  参考3  参考4

    1.指针 也是一种变量。指针内部存的是一块内存的地址。

    //指针: 通常我们说的指针其实是指针变量,相比于其他基本数据类型的变量不同,它存储的是数据对应的内存地址

        int *p = NULL;

        /*

         int * :指针变量的类型,指针变量类型规定存储空间的大小只和我们操作系统有关,对于32位的操作系统 4个字节,64 位操作系统 8个字节

         如:float * , char * ,long *

         int * 中:

         int 的作用就是通过指针变量存储数据时,决定一次性读几个字节数据

         指针的指向一定是我们可控的区域

         * 表示后边定义的变量是个指针变量,用来存储地址

         p 指针变量的变量名

         NULL 代表是指向一块无效地址的内存地址,恒为0

         */

        int a = 3;

        p = &a;//指针变量p 指向整型变量 a

        // 如何访问 a 的内容

        //1.直接访问 直接取变量的名字 a

        a = 10;

        //间接访问  通过指针变量访问

        // * 的作用 是一个取值运算符,根据指针变量P存储的地址去找到对应的内存空间

        *p = 20;// *p 在等号的左边的话,意味着给这块内存空间赋值 ;如果 *p 在等号的右边 就是取值操作

        //定义一个整型变量 赋值为30 定义一个指针 存放他的地址 通过指针变量来完成 取值和赋值操作

        int b = 30;

        int *q = &b;

        *q = 500;

        int i = *q ;

       //区别开这两种变量的空间大小

        //指针变量的空间 p

        //指针变量指向的空间 *p

    注意:

        int bb = 300;

        char *u = NULL;//把这里的char 改为 int 就不会出现 后面打印出随机值的情况了

        u = &bb;

        printf("%d ",*u);

        int bb = 300;

        char *u = NULL;//把这里的char 改为 int 就不会出现 后面打印出44的情况了

        u = &bb;

        printf("%d ",*u);

        //不是同一类型的变量在初始化的时候,有可能地址分配的不是连续的,比如int float double  char ,但是同类型的数据开辟内存的时候是联连续的

        int aa = 10;int cc = 20;int dd = 30;

        int *p = &cc;

        p++;//注意内存分配是从高到底,存取值是从低到高(**重要)

        printf("%d ",*p);

    自动变量:参考

    指针和数组的区别:

           1.指针能够重定向        

            2.空间大小,指针变量的空间大小只与操作系统有关系 32位对应的是4个字节 64位 对应的是8个字节 。数组的空间大小,数组元素的个数 * 单个元素所占的空间大小 
           3.指针可以重指向,数组名不可以重指向,数组名代表数组的首地址,常量地址,之不可以改变,而指针是一个变量,可以重新赋值。


           // scanf("%[^ ]",a);只有在scanf()里面输入多个单词里面有多个空格的话,要用到这个格式化去处理多余的空格

    区别定义

    指针数组:用来存放的指针的数组,就是数组元素都是指针

    数组指针:指向数组的指针

    数组指针 :是指针,指向数组数组的指针

    指针数组 :是数组,存放指针指针的数组

    用法
    (1)指针数组:  int * a[4]  表示 a[4] 数组里面存放的都是 int 类型指针。  元素表示   * a[i]   与  * (a[i]) 是一样的,因为 [] 的优先级高于 *

    (2)数组指针:  int (*a)[4] 表示 指向数组 a 的指针 表示 (*a)[i]

     注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧

    定义结构体指针实战

    // 定义一个结构体 里面有四个成员变量
    struct student{
        char name[20]; //姓名
        float score;   //分数
        int age;       //年龄
        char gender;   //性别
    };
    typedef struct student Student;
    
    void outputSingleInfo(Student *u);
    int main(int argc, const char * argv[]) {
       
        Student stu1 = {"Ann",'f',96,21};
        //访问结构体成员
    //    stu1.name;
        //结构体指针变量,指向 stu1
        Student *p = &stu1;
    //    p -> name;//p里面存放的是 stu1 的地址,指向操作符 就是去访问里面的每个变量(用结构体指针变量访问成员)
        // -> 就是指向操作符
        
        //输出一个结构体变量的成员信息
         outputSingleInfo(p);
        
        //定义一个有五个元素的结构体数组
        Student students[5]={
            {"zhao",'m',95,23},
            {"zhang",'f',90,22},
            {"yang",'m',94,21},
            {"wang",'m',96,25},
            {"fan",'f',93,20}
        };
            return 0;
    }
    void outputSingleInfo(Student *u){
        printf("%s,%c,%d,%f",u->name,u->gender,u->age,u->score);
    }
    // 定义一个结构体 里面有四个成员变量
    struct student{
        char name[20]; //姓名
        char gender;   //性别
        float score;   //分数
        int age;       //年龄
        };
    typedef struct student Student;
    //访问结构体成员
    //stu1.name;
    
     //结构体指针变量,指向 stu1
        Student *p = &stu1;
    //p里面存放的是 stu1 的地址,指向操作符 " -> "  就是去访问地址所指向空间里面的某个变量(用结构体指针变量访问成员 name  如: p -> name; )
    // -> 就是指向操作符
  • 相关阅读:
    Java内存模型
    Thread.sleep(0)的作用
    Java中用到的线程调度算法是什么
    怎么检测一个线程是否持有对象监视器
    为什么要使用线程池
    ThreadLocal
    生产者消费者模型的作用
    线程间通信
    线程安全
    c#常日期转换(转)
  • 原文地址:https://www.cnblogs.com/benpaobadaniu/p/4701095.html
Copyright © 2011-2022 走看看