C语言中的结构体指针

  • Post author:
  • Post category:其他


###

C语言中的结构体指针

  1. 结构体指针概念
  2. 结构体变量成员访问
  3. 结构体指针作为函数参数
  4. 结构体数组指针

    5.结构体指针数组
  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;	
};

代码如下:

 struct address{
     char *country;
     char *city;
     char *street;
};

struct student{
    int xh; 
    char *name;
    int age;
    int gender;
    struct address *addr;
};
#include<stdio.h>
#include"student2.h"
#include<string.h>

void out_student(struct student *stu);
void out_students(struct student *stups[],int n);
int main(void)
{
    struct address addr1 = {"china","shanghai","beijing road"};
    struct student stu = {1,"zhangsan",10,1,&addr1};
    struct student *stup1 = &stu;

    struct address addr2={"jap","dongjing","hefei road"};
    struct student stu2 = {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);

    /*定义一个结构体的数据*/
    struct student  stus[] = {stu,stu2};
    struct student *stup2 = stus;

    int i ;
    for(i = 0 ;i < 2 ; i++)
    {
        out_student(stup2+i);
        printf("---------------------------------");
    }

    /*定义一个结构体指针数组*/
    struct student *stups [] = {stup1,&stu2};
    out_students(stups,2);
    return 0;
}


void out_student(struct student *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));
}

void out_students(struct student *stup[] ,int n)
{
	//代码省略
}

欢迎大家的访问,代码可以进行run,因为最近比较忙,所以可能质量有点小下降,后面会修正。谢谢大家的访问



版权声明:本文为qq_29924041原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。