• 【C疯狂的教材】(九)C语言指针(一)


     1、什么是地址?

     

        内存是由若干个1个字节的内存单元组成的存储器

        计算机为了管理内存单元。给每一个字节都进行编号

        编号的就是地址


     

     2、什么是指针?

     

        地址就是指针

     

        地址:

        地址指向的内存单元值:编号相应的存储内容

     

     

        变量訪问的方法:直接訪问    间接訪问

     

        1)直接訪问:用变量名訪问其代表的存储空间 

        2)间接訪问:通过内存地址訪问地址所相应的存储单元的内容

     

     

     3、指针和变量之间的关系

     

        指针能够间接的訪问变量的值

     

        1)指针变量:就是用来存放地址的变量

     

           指针变量也遵守变量使用的规则 :先定义  --->初始化 -->使用

     

        2)怎样定义一个指针变量

     

           数据类型* 指针变量名;

     

           int *p;  

           //变量名 p   

           //int表示什么意思? 表示指针变量仅仅能存放一个整型数据的地址

           //* 什么意思?    int p;//普通的整型变量,int *p;//指针变量

     

        3)指针变量初始化

     

           为什么要进行初始化?

     

           首先,假设普通的一个变量没有初始化,会有什么后果?  //垃圾值

           

           对于指针变量。int *p;   //p 随机的。p 0xff1111  10

                       *p = 10; //假设不初始化直接使用。可能会导致系统崩溃

     

           野指针:定义之后,没有初始化

      

           1)定义的同一时候进行初始化

     

               int *p=NULL;   //赋值为NULL ,表示谁都不指

               int *p1 = 0;   //同上

     

     

               int a=10;

               int *p2=&a;

               int *p3=&a;

               int *p4 = p2;

               p3 = p4;    //指针的指向能够改变

     


     

           2)先定义。后出初始化

          

              int *p;

              p = NULL;

     

              int *p1;

              p1=&a;

     

     

             注意:

             1)多个指针能够指向同一个变量

             2)指针的指向是能够改变的

             3) int *p;   p = 100;//错误的 存放的时地址,如今给的时整数值

             4*p = &a;错误  //*p是整型的变量。仅仅能赋值数值

     

          3)使用指针变量间接的訪问变量值

     

             int *p = &a;

             *p  就是訪问p中存放的地址代表的存储空间的值

                 p指向的存储空间的值

     

     4、指针的应用场景

     

        1)在被调函数中,改动主调函数的变量值

        2)能够让函数有多个返回值

     

     5、指针变量为什么要区分类型

     

        前提:不同类型的指针变量在内存中占用8个字节

     

            为什么都占用8个字节还要区分类型呢?

     

        char *c;  //c存放的时地址   *c c存放的地址開始 ,连续取1个字节

        int *p;                   *p p存放的地址開始 ,连续取4个字节

        

        int a=10;

        char *c2 = &a;    //从变量a的首地址開始。取了1个字节(实际4个,取少了)

     

        double *d1 = &a;  //从变量a的首地址開始,取了8个字节(实际4个,取多了)

     

    6、多级指针介绍

     

        二级及以上的指针

     

        一级:指针指向的是一个基本数据类型变量的地址

        二级:指向的又是一个地址

        

             int a = 10;

             int *p = &a;   //p是一级

     

             int **p1 = &p;  //p1 ---> p    p1是二级

     

     

    7、指针和数组之间的关系

     

        1)数组指针:

         

           指向数组元素的指针变量

     

           int a[5];    //a[0]  a[1] 直接訪问

     

           目标:用地址也能够訪问数组元素

     

           1)数组名訪问

     

               a存放的是数组的首地址(常量)   == &a[0]

               *a     ==   a[0]元素的值

     

               a+1   指向数组的下一个元素

               a-1   指向数组的上一个元素

     

               *a+1   ==  a[0]+1;

               *(a+1) ==  a[1]元素的值

     

     

     

               int *p; //指针变量

               p = a;  //p指向了数组a的第一个元素

               p = &a[0];

     

               p+1 指向数组的下一个元素

               p-1 指向数组的上一个元素

        

                 *p  ==   a[0]元素的值

                 *p+1   ==  a[0]+1;

                 *(p+1) ==  a[1]元素的值

     

               p = p+1;   //p移动到了下一个元素 

               p++;

               *p++  == *(p++) == *(p = p+1)

     

        2)指针数组:

     

               指针数组:数组的每个元素都是一个指针

     

               int a[2][3]={1,2,3,4,5,6};    // a[0]  1,2,3    a[1] 4,5,6

               int *pa[]={a[0],a[1]};


                printf("%d ",**(pa+1));    //4

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    Thread与Handler
    开始机顶盒的生涯
    解决布局被键盘顶的难题
    自动滚动的Textview
    2-解决粘包问题
    1-socket编程
    zipfile模块
    subprocess模块
    day31-异常处理
    collections模块
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4853751.html
Copyright © 2020-2023  润新知