怎么擅用指针?
2015-12-05 08:58
253 查看
C语言程序设计
指针
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
下面是一个定义指针一个示例
int i = 3; //定义一个int型变量的地址
int *p ; //定义一个指向int型数据的指针变量p
p = &i; //让p记下变量i在内存中的地址
printf(“%p\t%d\n”, &i, i);
‘*’称之为间接引用,表示根据指针变量里保存的地址值,去这个地址里取数据,能取几个字节取决于此地址变量的定义类型。
printf(“%p\t%d\n”, p, *p);//取出指针p指向的变量的值
*p = 3000; //将p指向的变量的值置为3000
printf(“%d\n”, i); //打印出i的值为3000了
指针的本质就是保存一个地址,在32位的系统上,所有程序的内存地址都用4个字节表示,所以不管是什么类型的指针,指针大小都占4个字节。
printf(“%d\n”, sizeof(p));//打印出指针变量p所占用的字节数
指针在C/C++开发中的常用用法。
a.通过指针对变量的间接引用
int func1()
{
int number = 100;
int *pNum = &number;
*pNum = *pNum+1;
printf("%d %d\n",*pNum,number);
return 0;
}
b.通过指针对数组的间接引用
int func2()
{
int array[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
int *pNum = array;
int i;
for(i=0;i<12;++i)
{
printf("%d %d\n",*pNum++,array[i]);
}
return 0;
}
c.通过指针作为函数参数(作输入输出用)
int func3(char *array)
{
int *pNum = array;
int i;
for(i=0;i<12;++i)
{
printf("%d %d\n",*pNum++,array[i]);
}
return 0;
}
d.通过指针作为函数返回值
int* func3(char *array)
{
int *pNum = array;
int i;
for(i=0;i<12;++i)
{
if(*pNum == 7)
return pNum;
}
return NULL;
}
e.通过函数指针实现对函数功能的调用
int (*pfunc)();
pfunc = func1;
pfunc();
f.指针数组和数组指针傻傻分不清楚
指针数组本质上是数组,每个元素是指针。形如int *array[20];
数组指针本质上是指针,指向一个数组。形如 int (*array)[20];
不正确的用法造成程序的隐患
正确的的指针用法,应当能考虑到当前指针的状态。
那么指针应当有以下几种状态:
空指针 正常指针 野指针(未初始化指针 悬空指针 越界指针)
对于正常的指针应当是已被初始化过 并且有指向的buffer,指向的buffer位置和生命周期都应该正确;
空指针相对于野指针有一个优势就是对空指针进行解引用操作程序会dump;
对于野指针则可能会异常,也可能不会。
那么对野指针的3种情况:
需要让指针有一个正确的初始值 指向变量或者buffer所在单元;
对于指针悬空的情况 处理方法就是 熟悉变量和buffer的生命周期 并且不放回临时对象 变量 buffer的地址;
对于指针越界的情况则需要我们在对指针解引用的情况下通过控制指针活动范围以防止越界。
触类旁通
C/C++大多数内存问题都是指针引起的,希望朋友们能够自己总结,触类旁通找到对应的解决方案。
相关文章推荐
- 【JAVA】集合交并补
- 【PA2014】【BZOJ3725】Matryca
- Linux运维 第五阶段(三)mysql高可用(基于heartbeat、nfs)
- 制作一个简单的包含有过滤器的登录程序
- java流分析一个基础程序
- Android控件之DatePickerDialog
- 开发笔记 - PHP返回的数据问题
- ASIHTTPRequest类库简介和使用说明
- 关于java与Android(安卓)中为什么要在new一个对象的后面加一个this的原因
- 动画特效十九:自定义过度动画2
- 图片热点链接
- hdu1257 最少拦截系统
- 开发首屏广告(Android)简述
- 九九乘法表
- 九九乘法小练习
- chengfa
- Linux运维 第三阶段 (十四)rsync
- OpenJudge_P7215 简单的整数划分问题(DP)
- Android之点击对话框(AlertDialog.Builder)外部区域不关闭对话框的设置
- 数组初学