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.二级指针
本质上也是一个一级指针,只不过指向的内容也是一个一级指针。二级指针不能和一级指针之间相互赋值,可以通过两次解引用运算访问某个类型的变量。
指针
最新推荐文章于 2023-03-10 11:25:33 发布