c语言指针的经典教程
网络出版时间:2013-03-13 10:47
指针在C语言中的作用分析
湖南城市学院 通信与电子工程学院 舒 翔
指针是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个里可能存储了重要的数据,而由于未认真使用指针,这三个字节的值被改变了,造成崩溃性的错误。所以在使用指针时,使用者必须清楚指针究竟指向了那里。
河南科技2012.09下
37

你可能喜欢
- C语言指针详解
- 语言分析
- C语言经典程序
- c语言经典100例
- c语言总结
- 彻底搞定C指针
- 专升本历年试题
- C语言指针用法详解8页
- C语言中的指针详解6页
- 彻底搞定C语言指针详解-完整版- 适合初学者-必备14页
- C语言指针用法详解15页
- C语言中不同的结构体类型的指针间的强制转换详解3页
- 详解C语言指针变量交换问题2页
- C语言经典程序3页
- 经典C语言程序100例子68页
- 12864液晶经典驱动程序,一看就懂,有详细的注释(C语言编写,不看后悔)5页
- 经典C语言程序设计100例71-3页
- 经典C语言程序设计100例51-2页
- 经典C语言程序设计100例41-502页
- c语言经典算法100例77页
- C语言程序设计_梁栋_经典c程序100例==11--207页
- c语言经典算法100例(省纸版)41页
- c语言经典100例30页
- 经典c语言程序100例71-809页
- 经典c语言程序100例61-707页
- 历年专升本试题3页
- 专升本历年试题归纳14页
- 专升本C语言历年考试题及答案18页
- 华东交通大学历年专升本试题9页
- 历年专升本单选与汉译英试题27页
- 专升本管理学历年试题分析7页


