- 论坛徽章:
- 0
|
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. 指针能干什么?
要说明白这个问题首先就要说说内存地址,计算机中的内存都是编址的,就像我们住所的地址一样。在程序编译或者运行的时候,系统(可以不关心具体是什么,可能是编译器,也可能是操作系统)开辟了一张表。每遇到一次声明语句(包括函数的传入参数的声明)都会开辟一个内存空间,并在表中增加一行纪录。记载着一些对应关系。如下表所示:
指针则是一个用来指示一个内存地址的计算机语言的变量或中央处理器(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) 指针数组:数组元素是指针的数组,注意变量的本质是数组不过其中的元 素是指针。
声明格式:类型 *变量名[个数]
例 如:
int *p[10]; 表示一个有10个以指向整形数据的指针为元素的数组。
赋 值:
如:定义 int s;
int *p[1];
p[0]=&s;
(6) 指针函数:返回值是指针的函数,注意本质是函数只是返回值是指针。
声明格式:类型 *函数名(参数)
例 如:
int *p(char m);表示一个有一个字符型参数返回只需向整形变量指针的函数。
赋 值:
如:定义
char *fun();
4. 指针分析
记得看过一些关于指针的资料,作者是这样总结指针的,我觉得分析的很精辟,在这里和大家分享一下:
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
(1)指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
【1】int*ptr;//指针的类型是int*
【2】char*ptr;//指针的类型是char*
【3】int**ptr;//指针的类型是int**
【4】int(*ptr)[3];//指针的类型是int(*)[3]
【5】int*(*ptr)[4];//指针的类型是int*(*)[4]
(2)指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
【1】int*ptr; //指针所指向的类型是int
[ 本帖最后由 langue 于 2009-9-5 14:44 编辑 ] |
|