zoukankan      html  css  js  c++  java
  • C和指针(6-10章)

    位:bit,计算级的内存最小细分,一个位能表示的值范围太有限

    字节:Byte,因此将8个位组成一个字节,内存的最小存储单位。--------------------------指针可以指向的最小位置

    :为了存储更大的值,把两个或多个字节合在一起作为一个更大的内存单位。一般由2个或4个字节组成。注意:此时每个字只有一个地址

    记住所有的内存地址太笨拙:因此高级语言的特性之一就是-------通过名字而不是地址来访问内存位置。这个名字其实就是内存地址的映射,但是是由编译器实现的,而不是硬件。硬件仍然访问的是内存地址。

    间接访问操作符:*,通过一个指针访问它指向的内存地址的数据。------解引用  Dereferance

    操作系统与IO设备通信是通过在某个特定内存地址读取和写入值来实现的,这个内存地址其实就是设备控制器接口。 

    未初始化指针就去给其赋值,可能引发:

                      1.直接报错,如果指针本身指向了个不能更改的地址,庆幸

                      2.指针本身地址不是不可写的,那么有内存被重写!,悲剧。

                      3.因此指针使用前,要先初始化为NULL或一个已知的可用地址。

    NULL指针:表示未指向任何东西,因此对其解引用非法。即对指针解引用前,要先判断是不是NULL指针。

    指针运算:(1.关注返回值,2.自增自减和返回动作的先后顺序

         *cp +1 :先对cp解引用,再+1

      cp++:后缀++,先返回指针变量cp的一份拷贝,然后再增加cp的值。因此表达式的值就是cp的拷贝

      ++cp:前缀先++,即先增加指针变量cp的值,再返回cp的拷贝。即返回的是++后的拷贝。

    ·  *cp++:后缀++优先级高于*,先返回cp的拷贝,然后对cp拷贝解引用;然后再++操作符增加指针cp的值。

      ++*cp:首先解引用cp,然后+1,最后返回这个增值后的值的一份拷贝

      (*cp)++:首先解引用,然后返回解引用的值的拷贝(就是cp本身的值),然后将cp的解引用值+1。

    字符串指针数据:一个指针指向一个指针数组,其中每个位置是一个字符指针。最后一个位置一定是一个NULL指针,表示指针数组的结束

    本质上指针就是一个变量而已,只是存储数据有些特殊。

    c中,所有传递给函数的参数都是通过传值方式调用的,但是数组名作参数好像是通过传址调用。其实不然,依然是传值(复制一份),只不过此时复制的是指向数组起始位置的地址指针。数组名是常量指针,它的地址不会改变。

     数组名本质上就是数组第一个元素的指针。因此不能通过 array1 = array2 复制数组到array1,必须逐个遍历。

    *(array2  + 2)  和  array2[2]  效果一样。下标容易理解,但是指针效率更高。

    类似的,对于多维数组,数组名就是一个指向它的第0维的第一个元素的指针,比如二维数组的数组名就是一个指向一维数组的指针。


    在绝大多数表达式中数组名的值是指向数组第一个元素的指针,两个例外:1.sizeof函数 ;  2. & 返回一个指向数组的指针,而不是数组第一个元素的指针的指针。

      即: & array 不是 array。array是数组首元素的地址, &array是整个数组的地址。

    数组名在声明后编译器就会分配内存,数组名是常量,声明后就可以间接访问。但是声明指针时,编译器只为指针本身保留内存空间,是指针变量,必须先初始化才能访问。

    C中函数所有的参数都是传值调用,即便时传递的指针,也是首先复制一份指针,然后进入函数操作。但是数组名是常量指针,除非去整体迁移数组,否则地址不会改变。

    函数的形参只是一个指针,因此函数原型中也不必写明它的元素个数,因此函数不会为其分配内存空间。这个形参指针指向已经在其他地方分配好内存的空间。

    字符串:C中char指的是单字节类型,占1个Byte的。

      C中字符串就是一串字符序列,以NUL为终止符表示一个字符串的终止,但是这个终止符并不是字符串的一部分

      复制字符串: char  *strcopy( char *dst,  char *src);

      拼接字符串: char  *strcat(char *dst ,char *src)            都是返回第一个参数的拷贝,即指向目标字符数组的指针

      字符串比较:本质是一种字典比较谁先不匹配谁小

            int  strcmp(char *dst,char *src);如果二者相等,返回0。如果dst<src 则返回一个负数,若dst>src则返回一个正数

      字符串单字符查找:

            strchr

            strrchr

      查找任何几个字符:

             strpbrk

      查找一个子串:

             char  *strstr(char const *s1, char const *s2):在s1中查找s2第一次出现的位置,并返回此位置的指针。若查找不到,返回NULL指针。

    内存拷贝的通用语句:memcpy( dst, values ,sizeof(values) ) 

        

    c中结构是为了存放不同数据类型的值类似pandas中的记录,数组这种只能存放单一类型,字符数组,整型数组等。   

    结构成员的访问方式:

              1.直接访问·点成员运算符  stuct.a

              2.间接访问:只有指向结构的指针时,Ptr_struct -> a

  • 相关阅读:
    badboy安装及使用(网页录制可用于jmeter)
    allure使用MASTER_HELPER报错cannot find reference MASTER_HELPER in allure.py
    Python之Django--ORM连表操作
    Python之前端
    Python之线程池
    Python之Web框架们
    Python之Django【进阶篇 】
    Python之Django【基础篇】
    Python框架之Tornado(四)源码之褪去模板外衣
    Python框架之Tornado(四)源码之褪去模板外衣的前戏
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12830311.html
Copyright © 2011-2022 走看看