指针
2016-07-20 20:07
183 查看
指针
一、指针
1.定义指针是变量,保存的是地址,固定4字节
int
num = 5;
![](http://img.blog.csdn.net/20160720201048397?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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:0004和23A1: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)释放空间6)ptr的空间已经释放,但是还是指向原来的空间,所以需要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 }
NULL为0地址,指向的也是空
#define NULL (void*)0
0地址空间不容许操作,不容许访问
一、指针
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:0004和23A1: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)释放空间6)ptr的空间已经释放,但是还是指向原来的空间,所以需要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 }
NULL为0地址,指向的也是空
#define NULL (void*)0
0地址空间不容许操作,不容许访问
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- Lua和C语言的交互详解
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C和指针小结(推荐)
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总