志在指尖
用双手敲打未来

结构体指针(如何定义和使用)

结构体指针

1.首要界说一个结构体,给它取别号:
typedefstructnode{
structnode*next;//指向下一节点
intdata;//数据域
}pnode,*linklist;;//别号与指针名
2.界说结构体指针与指针变量,给出几种不同的界说办法
structnode*a,b;
pnode*c,d;
linklistp;
他们别号的联系如下:
linklist=structnode*=pnode*;
pnode=structnode;
这儿的a即指向结构体node的指针,b为结构体变量。两者之间联系为:
a=&b;
其他界说办法之间联系为(这儿指的是类别之间联系):
c=&d;c=&b
d=b;
p=a;p=c;p=&b;p=&d
像这之中c和p也是指向结构体node的指针。
3.结构体成员的拜访:
指针可以用”->”来拜访成员变量,结构体目标用”.”来拜访,指针也可以用”.”来拜访,
(1)结构体目标拜访成员变量时:
b.data=2;
(2)指针的拜访成员变量办法:
a->data=2;
(*a).data=2;
4.函数传递结构体指针和变量的办法
由于指针指向结构体的首地址,假定函数为:
intsum(structnode*a,structnode*p);
传递时:
指针为:sum(a,c);
结构体变量为:sum(&b,&d);结构体

结构体指针如何定义和使用

前面咱们经过“结构体变量名.成员名”的方法引证结构体变量中的成员,除了这种方法之外还能够运用指针。
前面讲过,&student1表明结构体变量student1的首地址,即student1第一个项的地址。假如界说一个指针变量p指向这个地址的话,p就能够指向结构体变量student1中的恣意一个成员。
那么,这个指针变量界说成什么类型呢?只能界说成结构体类型,且指向什么结构体类型的结构体变量,就要界说成什么样的结构体类型。比如指向structSTUDENT类型的结构体变量,那么指针变量就一定要界说成structSTUDENT*类型。
下面将前面的程序用指针的方法修改一下:
#include
#include
structAGE
{
intyear;
intmonth;
intday;
};
structSTUDENT
{
charname[20];//名字
intnum;//学号
structAGEbirthday;//生日
floatscore;//分数
};
intmain(void)
{
structSTUDENTstudent1;/*用structSTUDENT结构体类型界说结构体变量student1*/
structSTUDENT*p=NULL;/*界说一个指向structSTUDENT结构体类型的指针变量p*/
p=&student1;/*p指向结构体变量student1的首地址,即第一个成员的地址*/
strcpy((*p).name,”小明”);//(*p).name等价于student1.name
(*p).birthday.year=1989;
(*p).birthday.month=3;
(*p).birthday.day=29;
(*p).num=1207041;
(*p).score=100;
printf(“name:%s\n”,(*p).name);//(*p).name不能写成p
printf(“birthday:%d-%d-%d\n”,(*p).birthday.year,(*p).birthday.month,(*p).birthday.day);
printf(“num:%d\n”,(*p).num);
printf(“score:%.1f\n”,(*p).score);
return0;
}
输出结果是:
name:小明
birthday:1989-3-29
num:1207041
score:100.0
咱们看到,用指针引证结构体变量成员的方法是:
(*指针变量名).成员名
留意,*p两头的括号不可省掉,由于成员运算符“.”的优先级高于指针运算符“*”,所以假如*p两头的括号省掉的话,那么*p.num就等价于*(p.num)了。
从该程序也能够看出:由于指针变量p指向的是结构体变量student1第一个成员的地址,即字符数组name的首地址,所以p和(*p).name是等价的。
但是,“等价”仅仅是说它们表明的是同一个内存单元的地址,但它们的类型是不同的。指针变量p是structSTUDENT*型的,而(*p).name是char*型的。所以在strcpy中不能将(*p).name改成p。用%s进行输入或输出时,输入参数或输出参数也只能写成(*p).name而不能写成p。
相同,虽然&student1和student1.name表明的是同一个内存单元的地址,但它们的类型是不同的。&student1是structSTUDENT*型的,而student1.name是char*型的,所以在对p进行初始化时,“p=&student1;”不能写成“p=student1.name”。由于p是structSTUDENT*型的,所以不能将char*型的student1.name赋给p。
此外为了运用的便利和直观,用指针引证结构体变量成员的方法:
(*指针变量名).成员名
能够直接用:
指针变量名->成员名
来代替,它们是等价的。“->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”相同高。p->num的意义是:指针变量p所指向的结构体变量中的num成员。p->num最终代表的便是num这个成员中的内容。
下面再将程序用“->”修改一下:
#include
#include
structAGE
{
intyear;
intmonth;
intday;
};
structSTUDENT
{
charname[20];//名字
intnum;//学号
structAGEbirthday;/*用structAGE结构体类型界说结构体变量birthday,生日*/
floatscore;//分数
};
intmain(void)
{
structSTUDENTstudent1;/*用structSTUDENT结构体类型界说结构体变量student1*/
structSTUDENT*p=NULL;/*界说structSTUDENT结构体类型的指针变量p*/
p=&student1;/*p指向结构体变量student1的首地址,即第一项的地址*/
strcpy(p->name,”小明”);
p->birthday.year=1989;
p->birthday.month=3;
p->birthday.day=29;
p->num=1207041;
p->score=100;
printf(“name:%s\n”,p->name);//p->name不能写成p
printf(“birthday:%d-%d-%d\n”,p->birthday.year,p->birthday.month,p->birthday.day);
printf(“num:%d\n”,p->num);
printf(“score:%.1f\n”,p->score);
return0;
}
输出结果是:
name:小明
birthday:1989-3-29
num:1207041
score:100.0
但是要留意的是,只有“指针变量名”后边才干加“->”,千万不要在成员名如birthday后边加“->”。
综上所述,以下3种方法是等价的:
结构体变量.成员名。
(*指针变量).成员名。
指针变量->成员名。
其中第3种方法很重要,通常都是运用这种方法,另外两种方法用得不多。后边讲链表的时候用的也都是第3种方法。

指向结构体数组的指针
在前面讲数值型数组的时候能够将数组名赋给一个指针变量,从而使该指针变量指向数组的首地址,然后用指针拜访数组的元素。结构体数组也是数组,所以相同能够这么做。
咱们知道,结构体数组的每一个元素都是一个结构体变量。假如界说一个结构体指针变量并把结构体数组的数组名赋给这个指针变量的话,就意味着将结构体数组的第一个元素,即第一个结构体变量的地址,也即第一个结构变量中的第一个成员的地址赋给了这个指针变量。比如:
#include
structSTU
{
charname[20];
intage;
charsex;
charnum[20];
};
intmain(void)
{
structSTUstu[5]={{“小红”,22,’F’,”Z1207031″},{“小明”,21,’M’,”Z1207035″},{“小七”,23,’F’,”Z1207022″}};
structSTU*p=stu;
return0;
}
此刻指针变量p就指向了结构体数组的第一个元素,即指向stu[0]。咱们知道,当一个指针指向一个数组后,指针就能够经过移动的方法指向数组的其他元素。
这个准则对结构体数组和结构体指针相同适用,所以p+1就指向stu[1]的首地址;p+2就指向stu[2]的首地址……所以只需利用for循环,指针就能一个个地指向结构体数组元素。
相同需要留意的是,要将一个结构体数组名赋给一个结构体指针变量,那么它们的结构体类型必须相同。
下面编写一个程序:
#include
structSTU
{
charname[20];
intage;
charsex;
charnum[20];
};
intmain(void)
{
structSTUstu[3]={{“小红”,22,’F’,”Z1207031″},{“小明”,21,’M’,”Z1207035″},{“小七”,23,’F’,”Z1207022″}};
structSTU*p=stu;
for(;p<stu+3;++p)
{
printf(“name:%s;age:%d;sex:%c;num:%s\n”,p->name,p->age,p->sex,p->num);
}
return0;
}
输出结果是:
name:小红;age:22;sex:F;num:Z1207031
name:小明;age:21;sex:M;num:Z1207035
name:小七;age:23;sex:F;num:Z1207022
此外同前面“一般数组和指针的联系”相同,当指针变量p指向stu[0]时,p[0]就等价于stu[0];p[1]就等价于stu[1];p[2]就等价于stu[2]……所以stu[0].num就能够写成p[0].num,其他同理。下面将上面的程序用p[i]的方法修改一下:
#include
structSTU
{
charname[20];
intage;
charsex;
charnum[20];
};
intmain(void)
{
structSTUstu[3]={{“小红”,22,’F’,”Z1207031″},{“小明”,21,’M’,”Z1207035″},{“小七”,23,’F’,”Z1207022″}};
structSTU*p=stu;
inti=0;
for(;i<3;++i)
{
printf(“name:%s;age:%d;sex:%c;num:%s\n”,p[i].name,p[i].age,p[i].sex,p[i].num);
}
return0;
}
输出结果是:
name:小红;age:22;sex:F;num:Z1207031
name:小明;age:21;sex:M;num:Z1207035
name:小七;age:23;sex:F;num:Z1207022

未经允许不得转载:IT技术网站 » 结构体指针(如何定义和使用)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载