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;
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的使用次数一定要相同,否则就有错误;
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 |
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的使用次数一定要相同,否则就有错误;
相关文章推荐
- C语言类型转换
- C语言函数sscanf()的用法
- c++内存
- C语言冒泡排序算实现代码
- C/C++实战实用知识点记录
- C语言Side Effect与Sequence Point
- c++逐行读取写入txt文件的方法
- 【C语言基础】-03运算符
- C 语言操作符优先级和结合性
- C++ PP chapter Ⅶ C++的编程模块
- C++ 把输出结果写入到文件中
- C语言 程序 位运算
- C++Primer 变量和基本类型
- First Missing Positive
- 菜鸟浅谈C、C++
- 【训练题】单源最优路径 SPFA(队列优化)算法
- Effective C++:绝不重新定义继承而来的缺省参数值
- c语言之左右法则
- 在ubuntu中用vscode编译调试C\C++
- BZOJ 3172 [Tjoi2013] 单词 [AC自动机模板]