1.结构指针的概念
指针可以指向任何一种变量,因此也可以使指针指向结构变量。指向结构变量的指针叫做结构指针。结构指针变量的值是它所指向的结构变量所占用内存空间的起始地址。结构指针变量定义的形式为
siruct 结构名 *指针变量名;
结构指针也需要先赋值后使用,即把结构变量的首地址赋给结构指针,有了结构指针就可以用它来访问结构变量的成员。下面三种访问结构变量的成员的形式等价:
(1)结构变量名.成员名 (2)(*结构指针变量名).成员名 (3)结构指针变量名一>成员名//和结构数组要区分对待。
设有如下定义:
struct stru
{
int n;
}str,*p=&str;
则:
str.n:得到结构变量str的成员n的值。
(*p).n:得到p指向的结构变量str的成员n的值p->n:得到p指向的结构变量str的成员n的值。
p->n十十:得到p指向的结构变量str的成员n的值,然后使成员n的值加1.
十+p->n:等价于十+(p->n),使p指向的结构变量str的成员n的值加1。
(+十p)->n:先使p自加1,然后得到它指向的元素的成员n的值。
(p+十)->n:先得到p->n的值,然后使p自加1。
结构指针可以指向一个同类型的结构变量,但是不能指向结构变量的某一成员,如果要将某一成员的地址赋给结构指针,则需要用强制类型转换,先将成员的地址转换成结构指针的类型。
结构指针使用实例
#include<stdio.h>
int main()
struct books
{ int bno;
char bname[20],field[10],author[10],publisher[30];
float price ;
}
struct books bkl=
{100,"c programming","computer","xuwei","renminyoudian press",39.0};
struct books * p=&.bkl;
printf({" bno=%d, bname =%s, price=%f\n“ , bkl.bno,(*p). bname,p->price};
return O;
}
2.指向结构数组的指针
结构指针也可以用来指向一个结构数组,这时结构指针的值是结构数组的首地址。同样,结构指针变量也可以指向结构数组元素,此时结构指针变量的值是结构数组元素的地址。结构数组与结构指针的定义如下:
struct{
int a;
float b;
}a[3],* p;
p=a;
此时p指向数组a的第一个元素,“p=a;”等价于“p=&a[0];”,若执行“p++;”则此时指针变量p指向a[1]指向结构数组的指针示例。
#include <stdio.h>
struct st
{
int m, *n;
}*p;
int a[5]={10,20,30,40,50};
struct st s[5]={100,&a[0],200,&a[1],300,&a[2],400,&a[3],500,&a[4]};
int main( )
{
p=s;
printf("%d",p->m++);/*语句1 */
printf("\t%d\n",p->m);/*语句2*/
printf("%d",*p->n); /* 语句3 */
printf("\t%d",*十+p->n); /* 语句4 */
return 0 ;
}
3.结构指针作为函数参数
将结构变量和结构数组作为雨数参数进行数据传递时,由于要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,程序的效率很低。最好的办法是使用指针,即用结构指针变量作函数参数进行传送。结构指针作为函数的参数,要求对应的形参是一个同类型的结构指针,此时实参向形参传递的是结构指针的值,系统会为形参指针分配一个内存单元来存放实参结构指针变量的内容。由于指针中存放的是地址,因此实参指针和形参指针实际指向同一个地址,则在被调用函数中对形参值的修改会影响相应实参的值。这种函数参数形式执行效率高,可以完成比基本类型指针更为复杂的操作。
结构指针作为函数参数示例。
#include<sidio. h>
#include<string.h>
struct st
{
int x;
char y[10];
int z;
};
void fun(struet st *s)
{
s->x=112;
/*结构指针作为形参*/
strcpy(s->y,"wangli");
s->z=88;
}
int main()
{
struct st a={101,"zhangsan",98},* p=&a;
printf("%d,%s,%d\n",p->x,p->y,p->z);
fun(p);
/*结构指针作为实参*/
printf("%d,%s,%d\n",p->x,p->y,p->z);
return 0;
说明:在main()函数中定义了一个结构变量a和一个结构指针变量p,并且p指向结构变量a,则在程序中可以通过p来访问结构变量a中的各个成员。在函数调用fun(p)中,将结构指针作为函数的实参,传递给相应的形参s,s中存放的是p的内容(即a的地址)。在函数fun()的函数体内修改了形参结构指针变量s的各个成员值,则对应实参的成员值也会发生变化。
结构数组元素的地址作为实参进行传递。
#include<stdio.h>
struct rank
{
char * rid;
int sc[3];
};
char fun(struct rank * t)
{
int i,total=0;
for(i=0;i<3;i++)
total=total+t->sc[i];
t->rid=total>250?"Y":"N";
}
int main()
{
int i;
struct rank stu[3]={{"101",100,82,75},{"102",90,75,88},{"103",78,85,64}};
for(i=0;i<3;i++)
{
printf("%s" ,stu[i].rid);
fun(&stu[i]);
printf("\t%s\n", stu[i]. rid);
/*结构数组元素的地址作为实参*/
return O;
}
说明:在主函数main()内定义了一个结构数组stu并进行了初始化,然后在for循环中调用函数fun(),将结构数组元素stu[i]的地址作为实参传递给形参,形参结构指针变量和实参指向同一个地址,形参值改变的同时实参的值也同时改变。