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

posted @ 2020-05-05 15:43  Parallax  阅读(134)  评论(0编辑  收藏  举报