C语言结构体指针

简介: 指针结构体


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;    

};

代码如下:

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,因为最近比较忙,所以可能质量有点小下降,后面会修正。谢谢大家的访问

目录
相关文章
|
16天前
|
C语言
C语言结构体内存对齐
C语言结构体内存对齐
|
19天前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
16天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
16天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
26 0
|
16天前
|
存储 C语言
C语言自定义类型结构体详解
在C语言中,结构体是复合数据类型,能组合不同类型的数据显示。定义结构体用`struct`关键字,如`struct Student {char name[20]; int age; float score;};`。声明结构体变量如`struct Student stu1;`,访问成员用`.`操作符,如`stu1.age = 20;`。初始化可直接赋值`struct Student stu1 = {&quot;李四&quot;, 22, 85.5};`。结构体数组如`struct Student stuArray[3]`,结构体指针如`struct Student *pStu = &stu1;`。
5 0
|
19天前
|
存储 搜索推荐 编译器
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
|
19天前
|
存储 网络协议 编译器
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
|
22天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
13 0
|
22天前
|
存储 C语言
【C语言】深入解开指针(三)2
【C语言】深入解开指针(三)
|
22天前
|
存储 程序员 C语言
【C语言】深入解开指针(二)2
【C语言】深入解开指针(二)
【C语言】深入解开指针(二)2