指针小结

1、首先要准确理解指针的含义。“指针”是C语言中一个形象化的名词,形象地表示“指向”的关系,其在物理上的实现是通过地址来完成的。

  • &a是变量a的地址,也可称为变量a的指针
  • 指针变量是存放地址的变量,也可以说,指针变量是存放指针的变量
  • 指针变量的值是一个地址,也可以说,指针变量的值是一个指针
  • 指针变量也可称为地址变量,它的值是地址。
  • &是取地址运算符,&a是a的地址,也可以说,&是取指针运算符。&a是变量a的指针(即指向变量a的指针)。
  • 数组名是一个地址是数组首元素的地址,也可以说,数组名是一个指针,是数组首元素的指针。
  • 函数名是一个指针(指向函数代码区的首字节),也可以说函数名是一个地址(函数代码区首字节的地址)。
  • 函数的实参如果是数组名,传递给形参的是一个地址,也可以说,传递给形参的是一个指针。

2、 一个地址型的数据实际上包含3个信息:

表示内存编号的纯地址

② 它本身的类型,即指针类型

以它为标识的存储单元中存放的是什么类型的数据,即基类型

如:int a;        /* &a为a的地址,它就包括以上3个信息,它代表的是一个整型数据的地址,int是&a的基类型(即它指向的是int型的存储单元)。&a就是“指向整型数据的指针类型”或“基类型为整型的指针类型”,其类型可以表示为“int *”型。*/

3、要区别指针和指针变量指针就是地址,而指针变量是用来存放地址的变量

注意:并不是任何类型数据的地址都可以存放在同一个指针变量中的,只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。

int a,*p;	//p是int*型的指针变量,基类型是int型
float b;
p=&a;		//a是int型,合法
p=&b;		//b是float型,类型不匹配

4、什么叫“指向”?地址就意味着指向,因为通过地址能找到具有该地址的对象。对于指针变量来说,把谁的地址存放在指针变量中,就说此指针变量指向谁。

注意:void *指针是一种特殊的指针不指向任何类型的数据。如果需要用此地址指向某类型的数据,应先对地址进行类型转换。

5、要深入掌握在对数组的操作中正确地使用指针,搞清楚指针的指向。

int *p, a[10];		//p是指向int型类型的指针变量
p=a;			//p指向a数组的首元素

6、有关指针变量的归纳比较

C程序设计 | 指针小结-LMLPHP

7、指针运算

① 指针变量加(减)一个整数。

  p++; //将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加

② 指针变量赋值。将一个变量地址赋给一个指针变量。 不应把一个整数赋给指针变量

p=&a; 		//将变量a的地址赋给p
p=array; 	//将数组array首元素地址赋给p
p=&array[i];	//将数组array第i个元素的地址赋给p
p=max;		//max为已定义的函数,将max的入口地址赋给p
p1=p2;		//p1和p2是基类型相同指针变量,将p2的值赋给p1

③ 两个指针变量可以相减。如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数

④ 两个指针变量比较。若两个指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量“小于”指向后面元素的指针变量。如果p1和p2不指向同一数组则比较无意义。

8、指针变量可以有空值,即该指针变量不指向任何变量。

如:p=NULL;   /*NULL是一个符号常量,代表整数0。在stdio.h头文件中对NULL进行了定义:#define NULL 0 。它使p指向地址为0的单元。系统保证使该单元不作它用(不存放有效数据)。*/

注意:p的值为NULL与未对p赋值是两个不同的概念。前者是有值的(值为0),不指向任何变量,后者虽未对p赋值但并不等于p无值,只是它的值是一个无法预料的值,也就是p可能指向一个事先未指定的单元。

任何指针变量或地址都可以与NULL作相等或不相等的比较。如:if(p==NULL)

9、指针的优点:

  • 提高程序效率;
  • 在调用函数时当指针指向的变量的值改变时,这些值能够被主调函数所使用,即可以从函数调用得到多个可改变的值;
  • 可以实现动态存储分配。

如果使用指针不当,会出现隐蔽的、难以发现和排除的故障。因此,使用指针要十分小心谨慎。

 

10-05 14:22