您的位置:首页 > 编程语言 > C语言/C++

C语言学习之指针变量

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

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的使用次数一定要相同,否则就有错误;

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: