指针

指针

一、指针

1.定义指针是变量,保存的是地址,固定4字节

int num = 5

int num = 5;

int *p = =#

num++:对num所对应的内存空间加一0x1001

 p++p对应的内存空间的值加一0x1004

 (*p++6

*p:根据对应内存空间里保存的地址找到其对应的内存空间

P==# *p==num==*(&num);

int **pp=&p;

指针变量,保存的地址为*p的地址内存为4字节

P++0x1004

*pp++0x1004

pp++0x2004

**pp++6

**pp=*p=num=*&num *pp=p=&num

Int ***ppp

(***ppp)++:6

***ppp=**pp=*p=num=*(&num) **ppp=*pp=p=&num

 

近指针,远指针,巨指针

近指针是只能访问本段、只包含本段偏移的、位宽为16位的指针;

远指针是能访问非本段、包含段偏移和段地址的、位宽为32位的指针

远指针是32位指针,它表示段地址:偏移地址,远指针可以进行跨段寻址,可以访问整个内存的地址。

除了远指针和近指针外,还有一个巨指针的概念。

和远指针一样,巨指针也是32位的指针,指针也表示为16位段:16位偏移,也可以寻址任何地址。它和远指针的区别在于进行了规格化处理。远指针没有规格化,可能存在两个远指针实 际指向同一个物理地址,但是它们的段地址和偏移地址不一样,如23B0:000423A1:00F4都指向同一个物理地址23604!巨指针通过特定的 例程保证:每次操作完成后其偏移量均小于10h,即只有最低4位有数值,其余数值都被进位到段地址上去了,这样就可以避免Far指针在64K边界时出乎意 料的回绕的行为。当然,一次操作必须小于64K

 

 

2.定义指针的规范int*p int* p

3.指针的类型:int *p    char*p int(*ptr)[3]//指针类型为int(*)[3]

4.指针所指向的类型:int *ptr(指向的类型是int)     int(*ptr)[3](指向类型为int()[3])

5.指针的赋值运算

int *p;

int a;

int b[1];

p = &a;

p = b;

指针的赋值,“=”的左操作数可以是*p,也可以是p

当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;

当“=”的左操作数是p时,改变的是p所指向的地址。

野指针

int*p;

Scanf(%d,p);

p分配的随机地址,随机指向的内存空间的指针,导致内存泄漏

内存泄漏:指向一块不可访问(无访问权限)或者已经释放的内存

出现段错误

如何避免野指针?

1.当定义一个指针时,对指针初始化为空

为什么要初始化为空:1)指向空(NULL)指针不可访问,不可操作

   2)如果出现段错误,可以方便调试

2.当想要在指针中赋值时,检查指针是否指向合法的空间

使用malloc分配

1)分配空间2)检查是否分配3)清空内存空间4)使用指针5)释放空间6ptr的空间已经释放,但是还是指向原来的空间,所以需要ptr = NULL

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3 #include <strings.h>

  4

  5 #define MAX_SIZE l00*sizeof(char)

  6 int main()

  7 {

  8     char *ptr;

  9

 10     ptr = (char *)malloc(MAX_SIZE);//分配空间

 11     if(NULL == ptr)//检查是否分配

 12     {

 13         printf("malloc error\n");

 14         exit(1);

 15     }

 16     memset(ptr, 0, MAX_SIZE);//清空内存空间

 17     //bzero(ptr,MAX_SIZE);

 18     free(ptr);//释放空间

 19     ptr = NULL;//

 20

 21 }

NULL0地址,指向的也是空

#define NULL (void*)0

0地址空间不容许操作,不容许访问

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值