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

目录
相关文章
|
15天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
70 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
11天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
71 14
|
15天前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
75 10
|
15天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
44 9
|
15天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
40 7
|
20天前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
26天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
92 13
|
26天前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
54 11
|
19天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
19天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
61 3