C语言的灵魂——指针
李亚锋 顶嵌嵌入式培训高级讲师,外企工作背景(威盛中国),出版过多部嵌入式书籍,在国内众多知名高校授课经验。
大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。那么加强对指针的认识和理解,是提高C语言水平很关键的一部分。下面是一些指针总结,希望能够抛砖引玉大家相互交流相互学习。
1. 指针是什么?
指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。32位系统下寻址能力(地址空间)是4G-byte(0~2^32-1)二进制表示长度为32bit(也就是4B)。
所以我们经常看到这样的面试题
定义如下数据类型:
char * p;
Int * p;
struct stu{
Int m;
char a[10];
char * s;
……
};
Struct stu *p;
问:sizeof p是多少?
由于以上的p全是指针类型的变量所以在同一操作系统下他的大小是一致的,对于一个32为的系统来说其值为4.
2. 指针能干什么?
要说明白这个问题首先就要说说内存地址,计算机中的内存都是编址的,就像我们住所的地址一样。在程序编译或者运行的时候,系统(可以不关心具体是什么,可能是编译器,也可能是操作系统)开辟了一张表。每遇到一次声明语句(包括函数的传入参数的声明)都会开辟一个内存空间,并在表中增加一行纪录。记载着一些对应关系。如下表所示:
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-684.png
指针则是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。指针变量通过存储其他量的地址值来建立指示关系。正是由于这一点所以指针是一个与操作系统寻址范围相关的无符号整数。
指针一般出现在比较近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值。指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的.使C语言程序的设计具有灵活、实用、高效的特点。
3. 指针怎么用?
指针的使用大致分为如下的几个形式:
(1) 普通指针:指向整形、字符型、自定义结构等的常见指针。
声明格式:类型 * 变量名
例 如:
char * p; 表示指向一个char型数据变量的指针p。
struct stu *s;表示指向一个stu型结构体的指针p。
赋 值:可以在声明变量的时候赋值,也可以在声明之后赋值。
如:定义 int a;
int * p=&a;
或者,定义 int a;
int *p;
p=&a;都是可以的
(2) 数组指针:指向数组的指针。
声明格式:类型 (*变量名)[个数]
例 如:
char (*p)[10] 表示指向一个有十个元素的char型数组的指针。
赋 值:可以再变量声明的时候赋值,也可以声明之后赋值
如:定义 int a[10];
int (*p)[10]=&a;
(3) 多级指针:指向指针的指针。
声明格式:类型 *… * 变量名
例 如:
char **p;表示一个指向char型数据指针的指针p。
赋 值:
如:定义 char a;
char *p=&a;
char **p=&p;
(4) 函数指针:指向函数的指针。
声明格式:类型 (*p)(参数)
例 如:
int (*p)(char a); 表示指向一个返回值为int型,有一个char型参数的函数的指针。
赋 值:
如:定义 int fun(char *s,int a);
Int (*p)(char *s,int a);
P=fun;
(5) 指针数组:数组元素是指针的数组,注意变量的本质是数组不过其中的元 素是指针。
声明格式:类型 *变量名[个数]
更多文章参见:http://www.top-e.org/jiaoshi/html/?413.html
注释:以上文章为顶嵌原创技术文章,转载请注明,否则顶嵌享有追究法律责任的权利!
[
本帖最后由 topembedded 于 2009-9-5 10:17 编辑 ]