C语言中的结构体指针
- 结构体指针概念
- 结构体变量成员访问
- 结构体指针作为函数参数
- 结构体数组指针5.结构体指针数组
- 结构体的自引用与不完全声明
结构体指针的概念
概念:结构体变量的地址,指向某个结构体变量(同时也是结构体变量中第一个元素的地址)结构体指针变量中的值是所指向结构体变量的地址我们可以通过结构体变量可以指向结构体中包含的一些成员
定义一个结构体变量:
struct 结构体名 *结构体指针变量名;
如:struct address *addr;
结构体指针变量初始化:
结构体指针变量名 = &结构体变量;
或者:结构体指针变量名 = &(结构体变量.第一个成员)
注意:结构体指针必须要初始化以后才能够继续使用
结构体变量成员的访问
结构体指针 ->成员名;如addr->country;
(*结构体指针).成员名;(*addr).country;//很少去进行使用,注意必须去使用(),,因为.优先级大于*
结构体变量.成员名 stu.name
注意:如果是结构体指针的话,它是可以指向自己的(引用自己)
####结构体指针作为函数参数C语言中结构体传递参数,传递的时间,和空间都是很大的,因为其在调用的时候都是拷贝调用,效率是严重降低,因此结构体作为参数传递的话,此时对于效率一块,将大大的节省,严重降低了程序的效率
结构体指针作为函数参数传递,那么会有很大优化:(实参传向形参的只是一个地址)
out_student(struct student *stup);
//将结构体变量的地址传入进去
结构体数组指针
指向结构体数组的指针1:结构体指针可以指向一个结构体数组,结构体指针变量的值是整个结构体数组的首地址
struct student stus[] = {stu,stu2};
struct student *stup2 = stus;
2:结构体指针可以指向一个结构体数组中的变量,这时结构体指针变量的值就是该结构体数组元素的地址3:一个结构体指针虽然可以来访问结构体变量或结构体数组,但是不能指向结构体的成员
结构体的指针数组
结构体指针数组的使用对内存开销会大大降低
struct student *stups [] = {stup1,&stu2};
out_students(stups,2);
结构体指针的自引用
一个结构体内部包含一个指向该结构体本身的指针(必须是结构体指针)struct Self{int a;int b;struct Self *s; //必须是结构体指针,指向自身}
结构体的不完整声明:当一个结构体中去引用另外一个结构体指针,但是另一个结构体又去引用了前一个结构体指针,这样就造成了结构体类似死锁的现象,这个时候就需要用结构体不完整声明,从而去避免这种
struct B;
struct A{
struct *B b;
};
struct B{
struct *A a;
};
代码如下:
structaddress{
char*country;
char*city;
char*street;
};
structstudent{
intxh;
char*name;
intage;
intgender;
structaddress*addr;
};
#include<stdio.h>
#include"student2.h"
#include<string.h>
voidout_student(structstudent*stu);
voidout_students(structstudent*stups[],intn);
intmain(void)
{
structaddressaddr1= {"china","shanghai","beijing road"};
structstudentstu= {1,"zhangsan",10,1,&addr1};
structstudent*stup1=&stu;
structaddressaddr2={"jap","dongjing","hefei road"};
structstudentstu2= {2,"lisi",11,2,&addr2};
printf("student name:%s\n",stup1->name);
printf("student street:%s\n",stup1->addr->street);
printf("===================");
out_student(stup1);
out_student(&stu2);
/*定义一个结构体的数据*/
structstudent stus[] = {stu,stu2};
structstudent*stup2=stus;
inti ;
for(i=0 ;i<2 ; i++)
{
out_student(stup2+i);
printf("---------------------------------");
}
/*定义一个结构体指针数组*/
structstudent*stups [] = {stup1,&stu2};
out_students(stups,2);
return0;
}
voidout_student(structstudent*stu)
{
printf("student xh:%d\n",stu->xh);
printf("student name:%s\n",stu->name);
printf("student gender:%d\n",stu->gender);
printf("student age:%d",stu->age);
printf("stduent country:%s\n",stu->addr->country);
printf("student city:%s\n",stu->addr->city);
printf("student street:%s\n",stu->addr->street);
printf("*****************************");
printf("size of:%d\n",sizeof(stu));
}
voidout_students(structstudent*stup[] ,intn)
{
//代码省略
}
欢迎大家的访问,代码可以进行run,因为最近比较忙,所以可能质量有点小下降,后面会修正。谢谢大家的访问