C语言学习之指针变量


一、首先,指针是一个变量,,系统固定为指针分配内存空间,而且指针有自己的地址,指针能够存值,但这个值比较特殊---——地址;

1、指针的类型

(1)  int *ptr;//指针类型是int *

(2)  char *ptr;//指针类型是char *

(3)  int **ptr;//指针类型是int **

(4)  int (*ptr)[3];//指针类型是int (*)[3]

(5)  int *(*ptr)[4];//指针类型是int *(*)[4]

2、指针所指向的类型

(1)  int *ptr;//指针所指向的类型是int

(2)  char *ptr;//指针所指向的类型是char

(3)  int **ptr;//指针所指向的类型是int*

(4)  int (*ptr)[3];//指针所指向的类型是int()[3]

(5)  int *(*ptr)[4];//指针所指向的类型是int *()[4]

   3、

  int num = 5;(0x00000005)

&num =0x1000;

 

 

       00

       00

       00

       05

0x1003


0x1002

0x1001

0x1000  (首字节p作为整体的地址)
注意:步长不同,地址跳变长度也不同;

int num = 5;

int *p = #

等效为:p == #*p ==num ==*(&num);

指向的内存空间:*p

对应的内存空间:p

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

num++:对num 对应的内存空间的值加1;

p++:对p对应的内存空间的值加1(步长)

(*p)++:对p指向的内存空间的值加1

4、int **pp = &p;

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

   (**pp)++:5+1

   int ***ppp = &pp;

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

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

一维指针保存基本变量的地址;

二维指针保存一维指针的地址;

三维指针保存二维指针的地址;

5、字符指针

(1)char ch = ‘a’;

char *p = &ch;

(*p)++;a+1 = b;

(2)野指针

1、野指针不是NULL指针,是指向垃圾内存的指针。

野指针的成因有两种:

(1)指针变量为初始化;

(2)指针p被free或是delete之后,没有置为NULL,会被误以为p是一个合法指针;

例子:int *p;

      scanf(“%d”,p);//给p 指向的内存空间赋值

      printf(“%d\n”,*p);

运行一下,会出现段错误;

具体原因是: p为局部变量,系统为其默认初始一个随机值(内存空间),会造成段错误

这就是所谓的野指针问题:

他会导致内存泄漏:原因有二:(1).指向一块不可访问的内存;

(2)指向一块已经释放的内存;

具体该如何避免野指针呢?

1、在内存分配不成功时,在使用内存前检查指针是否为NULL;

2、内存分配成功,但是尚未初始化就引用他,所以要时刻记得赋初值;

3、内存分配成功且已经初始化,但操作超过了内存的边界,尤其是在for循环语句中,所以要时刻注意循环次数;

4、忘记释放内存,导致内存泄漏;所以动态内存申请与释放一定要配对,程序中malloc与free的使用次数一定要相同,否则就有错误;

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值