指针

1.什么是指针
  指针是内存的地址,指针变量是指变量的内容是某个类型在内存中的地址。因此指针包括指针的值和指针的类型两层含义。指针的类型描述了指针所能间接访问内存空间的大小。在32为系统上指针变量占4个字节,在64位系统上占8个字节。
2.void 和空指针
   void * 是指 指针变量的类型不定,它可以对应内存中任意大小的空间。可以把其他类型的指针赋给void
,在某些情况(如memset函数)可以用void * 来作为参数表征所有类型的指针。void * 不能解引用(其对应内存空间大小不定)
  空指针是指指针的值为0,而我们在给变量分配内存的时候不会用到这个地址,因此它也没有“指向的类型这一说法”。空指针也不能解引用(地址不合法且对应空间大小未知)
3.野指针
  访问非法内存空间。可能的原因有指针变量为初始化、数组访问越界、指针指向的空间已释放。因此在使用指针的时候需要多加注意。
2.指针的运算(容易产生野指针,使用时需要格外注意)
  (1)指针±整数
   指针做+-整数运算后的结果仍然是一个指针变量,只是其内容会发生改变。改变大小为指针所指向类型在内存中所占字节的大小。例如在用指针访问数组元素的时候,下标+-表示指针增加或者减少数组元素类型所占字节数。
  (2)指针-指针
   要求两个参与运算的两个指针指向同一个类型,且对应空间在一段连续内存中,否则无意义,只是语法上支持这样做。运算结果为整数,表示的是两个地址之间包含的对应类型空间的个数(运算结果可+可-)。可以理解为指针+-整数运算的逆运算。在C语言中不指针+指针运算。
  (3)指针比较大小
  比较两个指针是否相同。其他的比较运算(大于、大于等于、小于、小于等于)只是语法上支持,实际上没有意义。
3.指针数组
指针是“定语”,“数组”是“宾语”。它是一个数组,只是数组的元素是指针,即指向某个类型在内存中的地址。例如:int* a[];
4.数组指针
数组是“定语”,“指针”是“宾语”。数组指针是一个指向“数组”这一类型的指针。数组指针与“数组名指向数组首元素”的含义不同,在数组名隐式转换成指针类型时,它指向的是数组首元素。而数组指针指向的是整个数组,若对其做指针±整数运算,其内容该变量将为数组所有元素所占空间之和。其一般形式为:int (*p)[4] = &arr; // p为指向由4个整型变量构成的数组空间。
5.二级指针
本质上也是一个一级指针,只不过指向的内容也是一个一级指针。二级指针不能和一级指针之间相互赋值,可以通过两次解引用运算访问某个类型的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值