一、首先,指针是一个变量,,系统固定为指针分配内存空间,而且指针有自己的地址,指针能够存值,但这个值比较特殊---——地址;
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的使用次数一定要相同,否则就有错误;