理解结构体

结构基础知识

在C语言中结构体是一种数据结构。结构体可被声明为变量,指针或者数组等;同时,也是一些元素的集合,这些元素被称为结构体成员,且这些成员可以是不同的类型,成员一般用名字访问

struct Stu   //Stu为结构体标签
{
    char name[20];
    int age;
    charsex[5];
    char tele[12];
    char addr[30];//成员
}stu1,stu2;
//stu1和stu2均为全局的结构体变量,
int main()
{
   struct Stu stu;//创建结构体变量
}

匿名结构体,将结构体标签省略,则必须在后面申明全局变量,但是也存在类型不同的问题

struct
{
    char name[20];
    int age;
    charsex[5];
    char tele[12];
    char addr[30];//成员
}stu1;
struct
{
    char name[20];
    int age;
    charsex[5];
    char tele[12];
    char addr[30];//成员
}*pstu;
//两结构体成员一模一样
int main()
{
pstu=&stu1;/*error,两个类型不同,因为是匿名的结构体类型,通过其创建的变量编译器会认为他们是不同的类型*/
}

typedef简化struct

struct Stu 
{
    char name[20];
    int age;
    charsex[5];
    char tele[12];
    char addr[30];//成员
}stu1,arrstu[10],*pstu;

typedef  struct Stu stu;/*如果typedef加在结构体前面,则后面的全局变量则表示为这个结构体的新名字*/

int main()
{
    stu stu2;//省略struct
    stu arr2[10];
    stu *pstu;
    
    return 0;
}

结构体成员

1.直接访问

struct stu 
{
    char name[20];
    int age;
    char sex[5];
    char tele[12];
    char addr[30];//成员
};

typedef struct stu stu;

int main()
{
stu stu;//结构体变量
//stu.name="bit";//error,不能给常量赋值
strcpy(stu.name,"aaa");
stu.age=10;
printf("name=%s",stu.name);
printf("age=%d",stu.age);
return 0;
}

2.间接访问

-> 用于结构体指针

.  用于结构体变量

struct stu 
{
    char name[20];
    int age;
    char sex[5];
    char tele[12];
    char addr[30];//成员
};

typedef struct stu* pstu;

int main()
{
stu stu;//结构体变量
pstu pstu1=&stu;
//strcpy((*pstu1).name,"aaa");
//(*pstu1).age=20;
strcpy(pstu1->name,"aaa");
return 0;
}

结构体自引

例1.错误的方式

struct A
{
char name[10];
int age;
struct A sa;
}
int main()
{
struct A sa;
}

用递归造成死循环,不断的自己引用自己

改正

struct A
{
char name[10];
int age;
struct A *sa;//大小为一个确切的值,通过指针找到下一个
}
int main()
{
struct A sa1;
struct A sa2;
struct A sa3;
sa1.pa=&sa2;
sa2.pa=&sa3;
sa3.pa=NULL;
}

若想用typedef改写,则

typedef struct A//结构体内部嵌套同类型指针,重命名不能是匿名的结构体
{
char name[10];
int age;
struct A *sa;
}a;
int main()
{
    a sa1;
    a sa2;
    a sa3;
sa1.pa=&sa2;
sa2.pa=&sa3;
sa3.pa=NULL;
}

不完整声明

struct A
{
int i;
struct B b;
};
struct B
{
int i;
struct A a;
};
//不允许这种写法,会一直相互调用下去

改写为

struct B;
struct A
{
int i;
struct B *b;
};
struct B
{
int i;
struct A *a;
};

结构体初始化

struct stu
{
char name[10];
int age;
char sex[4];
char tel[12];
char add[20];
};
int main()
{
struct stu stu={"aaa",12,"male","123","xia"};
printf("%s\n",stu.name);
printf("%d\n",stu.age);

return 0;
}

结构体中含有结构体的初始化

struct A
{
 int a;
 char c;
 double d;
};
struct stu
{
char name[10];
int age;
char sex[4];
char tel[12];
char add[20];
struct A sa;
};
int main()
{
struct stu stu={"aaa",12,"male","123","xian"};//不完全初始化
struct stu stu={"aaa",12,"male","123","xian",{1,‘w‘,12.34}};//sa前的成员不可省略
printf("%s\n",stu.name);
printf("%d\n",stu.age);
printf("%1f\n",stu.sa.d);

return 0;
}

结构体大小

struct s
{
int a;
char c;
couble d;
};
struct s2
{
int a;
double d;
char c;
};
int main()
{
printf("%d\n",sizeof(struct s));
printf("%d\n",sizeof(struct s2));
return 0;
}
//输出16
      24

存在内存对齐规则

  1. 第一个成员在与结构体变量偏移地址为0的地址处
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址

对齐数=编译器默认的一个对齐数与该成员大小的较小值

vs中默认8,linux默认4

3.  结构体总大小为最大对齐数(每个成员变量除了第一个成员都有个对齐数)的整数倍

4.  如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍出,结构体的整体大小就是所有最大对其数(含嵌套结构体的对齐数)的整数倍

struct A
{
double d;
char c;  
short s;  
dpuble d2;
};
int main()
{
printf("%d",sizeof(struct A));//24
printf("%d",offsetof(struct A,d));//0
}

offsetof是求每个类型对其的地址

时间: 2024-10-13 07:35:46

理解结构体的相关文章

Swift入门篇-结构体

前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中是灰常重要的一部分,如果您很好的掌握结构体,在后面ios开发中,会理解的更加清楚. 一:结构体声明 格式: struct 结构体名 { } 说明: 1: struct 是定义结构体的关键字 例子 /* 1:struct 是结构体的关键字 2:student 结构体名称 3:student() 创建一

结构体语法梳理2-指针与一维数组

结构体指针与结构体数组 1.1 指针复习 对于指针的理解,我们一方面从语法层面上理解,一方面编译器角度理解会发生什么事情. type  *p = value; p+i   的结果是 value+sizeof(type)*i 对于指针变量p ,*前面的type决定了 如何通过p存储的地址去访问内存. 比如 int  *p1 = 0x10; char *p2 = 0x10; double  *p3 = 0x10; *p1 从 0x10地址处访问四个字节,并且把这四个字节的数据当int类型来看. *p

c++入门之初话结构体

结构体是一种具有一定数据结构思想的数据类型,我们在对待结构体的时候,用该从数据结构的思想去审视结构体.下面给出结构体的定义 1 struct mystruct 2 {char name[20]; 3 int score; 4 double average; 5 }: 上述是一段关于结构体类型定义的基本知识,总结两点: 1 struct 是关键字,不是变量类型,变量类型是 struct mystruct 2 注意每个结构体成员后面是分号:";",而不是逗号:",".

第九章 结构体与共用体

姓名:吕家浩    实验地点:教学楼514教室    实验时间:4月30日 一.本章要点 1.通过实验理解结构体和共用体的数据结构2.结构体.共用体中数组的使用及变量的赋值3.结构体和共用体定义时的嵌套使用(嵌套使用的结构体必须先定义) 二.实验内容 1.实验练习:9.1 问题描述:试利用结构体类型描述年.月.日,输入一个日期,统计该日期是本年度第多少天. 流程图 实验代码 #include<stdio.h> main() { struct date { int year; int month

结构体的应用与理解.戴维营第九天

学了结构体,通过从最简单结构体输入到结构体数组,结构体指针,结构体作为函数参数,包含结构的结构,每种都进行敲代码来理解和体会,另外还学到了栈,先进后出,后进先出,堆需要自己分配,同时一定要有个明确的指针,否则自己都会找到不到,程序中的malloc, calloc, realloc等函数都是分配内存. 由小的空间向大的空间分配, 堆是从下向上分配.至于链表还在练习中 #include <stdio.h> #include<string.h> struct Student /*学生结构

iOS runtime探究(一): 从runtime开始理解面向对象的类到面向过程的结构体

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639205 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

C++ 结构体深入理解

1. 结构体基础知识 有时需要将不同类型的数据组合成一个有机的整体,以供用户方便地使用.这些组合在一个整体中的数据是互相联系的.例如,一个学生的学号.姓名.性别.年龄.成绩.家庭地址等项,都是这个学生的属性,见图7.1. 图 7.1 可以看到学号(num).姓名(name).性别(sex).年龄(age).成绩(score ).地址(addr)是与姓名为“Li Fun”的学生有关的.如果在程序中将num,name,sex,age,score,addr分别定义为互相独立的变量,就难以反映出它们之间

对offsetof、 container_of宏和结构体的理解

offsetof 宏 #include<stdio.h> #define offsetoff(type, member)      ((int)&((type*)0)->member) /* ((type*)0)->member 释义:声明一个相应类型的结构体指针,该指针指向0地址处.再通过该指针访问各元素.我们只要获取一个指针就能访问其内部的元素吗,可以这么搞?其实我是想联系全局和非全局变量,通过上面这个代码也许你不明白我要表达的意思.请继续慢慢看,直到本文后面,结合本文

C语言结构体(struct)简单应用个人理解

struct用法 第一种 只有结构体定义 struct student{ char name[20]; int age; char class; }; 这里的struct student就相当于int等数据类型,可以用struct student定义变量,如struct student aaa,就类似定义int aaa:注意struct 和student合在一起才能表示一个结构类型. 第二种 结构体定义后面加一个变量 struct student{ char name[20]; int age;