APP下载

指针在C语言中的作用分析

2012-08-15湖南城市学院通信与电子工程学院

河南科技 2012年18期
关键词:常量指针字节

湖南城市学院 通信与电子工程学院 舒 翔

指针是C 语言的灵魂,可以这么说,如果没搞懂指针,就等于没有学习C 语言。在学习C 语言的时候,很多学生对指针感到很费解,之所以费解,不是因为指针概念有多复杂,而是在使用时会经常犯错误,所以在学习时重点要从使用的角度抓住问题的本质,把本质搞清楚以后,在回到最基本的概念入手来分析,问题就能很快解决。

只要变量在内存中存在,必然有一个地址。因为操作系统管理内存就是通过内存的地址的。如,定义一个变量,初始化100,int a=100,那么就会在内存中形成一个布局。在32 位系统中占4 个字节。假设这个变量的地址是1a1b,如果地址是可以用一个数表示,就可以把地址存在一个变量里。因此,再假设有这样的一个变量,起名字为p,在这个变量里放变量a的地址(1a1b),那么变量p 同样会在内存中形成一个布局。由此可知指针和变量没有实质性的区别,而最根本的区别在于其中存放的东西。对于一般的变量,只是给它一个初值或计算的结果,而指针里面存放的是另一个变量地址,可以说,指针的本质就是存放一个变量的地址的变量,如:int* p=&a;即p指向a,a 就是p 所指向的目标,那么p 就是指针,

一、*和&符号

&:取一个变量的地址。*:取一个指针的目标。

int*p 和*p 的区别:int*表示p 是一个指向int 类型的指针,这里*是一个类型说明符。

*p 表示对p 取目标,这里*是一个运算符。

二、二级指针和多级指针

既然p 也是一个变量,那么它在内存中也存在一个地址,并且这个地址同样也可以放到一个变量(pp)中。那么pp 就是一个指向指针的指针。这里pp 就是二级指针

与此类似,可以进一步得到多级指针的概念,int*pp=&p;//pp 二级指针。

三、指针的应用

1.将指针用于函数的参数,传递变量的地址,可以在函数中修改实参的值,代码如下。

void swap(int*a,int*b){int c=*a;*a=*b;*b=*c;}。通过指针取目标运算,从而实现了对实参的成功交换。

2.指针可以作为函数的返回值,但不要返回局部变量的指针,因为局部变量在函数返回时会被释放,具体代码如下:

int* foo(void){int a=100;int* p=&a;return p;//返回局部变量的指针}

但是再看看下面的代码,也是返回局部变量,在编译器上运行,没出错,可以得到正确的结果。

int add(int a,int b){int c=a+b;return c;}

int main(void){int c=add (10,20)}

这种情况和指针的是不一样的,实际上在函数返回以前,内存中的return 语句在执行的时候,会把c 的值复制到main 的栈里面,而只有等return 语句先执行完成了才释放栈,之后才执行其后的右括号。具体来说,编译器将右括号编译成一系列汇编代码,来释放函数的栈,return 语句执行完成以后,才释放栈,而在执行return 的时候已经复制了一份c 的值,所以在main 中拿到的是c 的值,而指针的情况拿到的是地址,而这块地址是已经释放了内存的地址,是不能得到其目标的值,所以还是那句话,要抓住问题的本质,不要被表面现象所迷惑!

3.野指针和空指针。

int*p//,没初始化,野指针,*p=100//可能引发错误

因p 指向的内存不明确,出于对内存的保护,有可能引发错误,打断进程。若产生段错误,解决它的方法有显式地初始化有效的内存:int a;int*p=&a;

另一种方法是初始化成空指针:int*p =NULL;

4.指针和数组的关系。

(1)数组名可以看做一个指针,所以通过指针可以遍历一个数组。

(2)数组和指针的区别:数组名是一个常量,不能被赋值,但是指针可接受其他变量的地址。

(3)常量指针和指针常量。常量指针就是指向常量的指针,该指针的目标不可修改,但指针本身可修改,int n=100,const int*p=&n;*p=200//error。指针常量就是指针类型的常量,该指针本身不能修改,但指针目标可被修改。int n=100,int*const p=&n;*p=2//0k.int m=1,p=&m//error.常量指针常量,指针的目标和本身都不可被修改,如cosnt int*const p=&n;

(4)指针和结构体的关系。可以声明一个指向结构类型的指针,struct mstruct s={1,2,3};声明结构对象s。struct mstruct*p=&s;声明指向结构对象s 的指针,则可以通过p 访问s 的三个成员变量,

四、指针安全问题

char s='a',int*p,p=(int*)&s,*p=1;在这里p 是一个int 类型的指针,它指向的是s 的首地址,在32 位系统中,s 占1 字节,int 占4 字节,最后一条语句不但改变了s 所占的1 字节,还把s 相邻的3 字节也改变了,那么这3 个里可能存储了重要的数据,而由于未认真使用指针,这三个字节的值被改变了,造成崩溃性的错误。所以在使用指针时,使用者必须清楚指针究竟指向了那里。

猜你喜欢

常量指针字节
科学照亮世界
——卡文迪什测定万有引力常量
No.8 字节跳动将推出独立出口电商APP
No.10 “字节跳动手机”要来了?
一次函数的学习引导
为什么表的指针都按照顺时针方向转动
简谈MC7字节码
低氧低分压环境下泡塑吸附火焰原子吸收光谱法测定常量金
基于改进Hough变换和BP网络的指针仪表识别
ARM Cortex—MO/MO+单片机的指针变量替换方法
人类进入“泽它时代”