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

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12830311.html
Copyright © 2011-2022 走看看