1、指针函数(返回指针值的函数):在C语言中,允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
定义的一般形式:
数据类型 *函数名(形参表){
/*函数体*/
}
这里的数据类型是表示返回的指针指向的数据类型
2、指向函数的指针:一个函数在编译时被分配给一个入口地址,这种函数的入口地址就称为函数的指针。
一般形式:数据类型 (*指针变量名)(函数参数列表);
或者:数据类型 指针变量名(函数参数列表);
“数据类型”指函数返回值的类型
可以用指向函数的指针作为参数,以实现函数地址的传递,这样就可以在被调用的函数中使用实参函数。
3、变量的指针:即变量的地址
1)指针变量:即存放变量地址的变量,它用来指向另一个变量。
指针变量的一般形式:基类型 * 指针变量名;其中基类型是指:指针变量所指向的变量的类型。
2) 指针变量的引用:
例:int a,*p; //定义了整型变量 a 和 指向整型变量的指针变量 p。
p=&a;//这里“&”为取地址运算符,将a的地址赋给指针变量 p
则 *p=a;//这里的 * p 为指针变量 p 所指向的存储单元的内容,即 p 所指向的变量的值
printf("%d",*p);//通过指针变量 p 访问整型变量。
指针变量可以作为函数参数,它可以将一个变量的地址传送到另一个函数中。
C语言中的实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作函数参数也遵循这一规则,不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。
4、指向数组元素的指针:即数组元素的地址,
1) 定义数组元素的一般形式:
int a[n];//定义a为包含n个元素的整型数据的数组
int *p;//定义p 为指向整型变量的指针变量(指针变量p的基类型应和数组 a 的基类型一致)
p=&a[0];等价于 p=a;//把数组a[0]元素(即a数组的首元素)的地址赋给指针变量 p。即使 p 指向 a 数组的第 0 号元素。C语言中数组名(不包含形参数组名,形参数组并不占据实际的内存单元)代表数组中首元素的地址。
上述的三行可定义为:int a[10];
int *p=&a[0];或者是int *p=a;
2) 通过指针引用数组元素
C语言规定:若指针变量 p 已指向数组元素中的一个元素,则p+1指向同一数组中的下一个元素。
例:数组元素是int型,每个元素占4个字节,则p+1意味着使p的值(是地址)加4个字节,以使它指向下一个元素。
若 p 的初值为&a[0],则:
a)p+i 和 a+i 就是 a[i]的地址,即指向 a 数组的第 i 个元素
b)*(p+i)或 *(a+i)是 p+i 或 a+i 所指向的数组元素,即 a[i].
c)指向数组的指针变量也可以带下表,如 p[i] 与 *(p+i)等价。
总结:引用一个数组元素,可以用:下标法,如 a[i] 形式; 指针法,如*(p+i)或 *(a+i)。其中 a 是数组名,p 是指向数组元素的指针变量,起初值 p=a。
注意:可以通过改变指针变量的值指向不同的元素。指向数组的指针变量 p 可以进行自加自减(++和--)操作来改变 p的值(即p的地址),但是数组名 a 是常量,不能进行自加自减运算。
3)用数组名作函数参数
用变量名作函数参数(指形参)时,通过函数调用不能改变实参的值;用数组名(或者指针)作函数参数(指形参)时,通过函数调用能改变实参的值。
一般形式:数据类型 函数名(int a[],int n) 等价于 数据类型 函数名(int *x,int n) //形参 a 是数组名,它等价于 *a,x为指针变量。即在此函数被调用时,系统会建立一个指针变量 a ,用来存放从主调函数传递过来的实参数组首元素的地址。
归纳总结:若有一个实参数组,想在函数中改变此数组中的元素的值,实参和形参的关系有4种(实质都是地址的传递):
a)形参和实参都用数组名(注:此时的形参数组可以不指定数组元素的个数,因为形参数组名实际上是一个指针变量,并不是真正开辟一个数组空间;但是定义的实参数组必须指定数组大小,因为要开辟相应的存储空间 )
b)实参用数组名,形参用指针变量
c)实参形参都用指针变量
d)实参为指针变量,形参为数组名(注:若用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的单元) |
|