指针相关概念

本文详细介绍了C语言中的指针相关概念,包括空指针NULL的定义和作用,野指针的危害,指针运算的规则,如自增、自减操作,以及二级指针、函数指针和结构体中指向自身的指针的应用。重点讨论了指针在内存管理和数据结构中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针相关概念

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", 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值