指针相关概念
文章目录
1. 常见指针
int *p,*q; //p,q都是指针
int *p,q; //p是指针,q不是
int *p = &a;
int *p2 = p; //p, p2两个指针指向的是同一块内存空间,他们中存放的都是a的地址
1.1 空指针
NULL 在 C 标准库头文件 stddef.h 中定义
*#define NULL ( (void )0 )
显然,这是一个宏定义。NULL 实际上是((void*)0) ,容易看出,外层的括号纯粹是为了防止歧义;里层的括号则是强制类型转换,转换成 void * 类型,本来 void * 类型是地址,那么这里的 0 自然就是地址 0 。
就是把地址 0 转换成指针类型,称为空指针,它的特殊之处在于,操作系统不会把任何数据保存在地址 0~0xfff (这段地址是受系统保护的)的页面映射到物理内存,所以任何对地址 0 的访问都会立刻导致段错误。
1.2 野指针
未初始化、或者说指向无效内存空间(已经进行free释放)的指针都叫做 野指针。
2. 指针之间的运算
-
指针可以加上或减去一个整数。
-
指针之间不能相加,也不能相乘,更不能做除法。
-
唯一可行的是减法,此外不同类型指针不能相减。
/*****指针变量加减一个整数*****/
int *p = &a;
p = p + 1;
p++、p--,
p+1 的结果实际上是当前地址增加 0x0004;增加的数值和 p 所指向的数据类型是有关的,如果 p 指向的是 char 型,那么加 1 的结果就是当前地址增加 0x0001;
自增就是加 1,当前地址增加 0x0004;自减是当前地址减去 0x0004,如果 p 指向的是 char 型,则减去 0x0001。
/******指针相减运行******/
#include <stdio.h>
int main()
{
printf("%d\n", (int *)0x0015 - (int *)0x0010); //1
printf("%d\n",