C语言语法教程-结构体

2018-09-30

结构体中成员变量地址是连续的,结构体用于描述记录。

Create a struct

//----------------------------
//struct1.c
//创建一个结构体,给结构体成员赋值,并输出一个成员值。
//----------------------------
#include <stdio.h>
struct teacher
{
/*
no、name、sex是成员
*/
    int no;
    char *name;//将存储字符串的变量声明为指针的形式,下面会谈到。
    char *sex;
};//使用中括号括起成员列表,后面加上分号
/*
上面是结构体声明,也可以放在main函数里面。
struct是结构体关键字,teacher是结构体名,struct teacher是结构体类型。
*/

int main(int argc, char const *argv[])
{
    struct teacher tech1;//定义一个结构体变量tech1,再次说明,teacher是结构体名。另外,丢掉struct也是可以的。
    tech1.no=1001;//成员赋值
    /*
    在声明结构体的时候,将存储字符串的变量声明为指针的形式,就可以在main函数中使用下面这种形式进行字符串变量赋值了。
    */
    tech1.name="wangfang";
    tech1.sex="女";
    //也可以这样:struct teacher tech1 = {1001,"wangfang","女"};不可以分开哟。
    struct teacher *p;//定义一个指向结构体的指针变量p
    /*
    一个指向变量的指针表示的是占内存中起始位置,一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组。
    为啥指针变量非要是struct teacher类型。因为通过指针变量存储的地址可以访问此地址以及后续地址所存储的内容,但是如何解析这个内容呢?
  所以要给指针声明类型,那么声明什么样的类型呢?显然,你要解析出什么样的类型就声明什么样的类型,你是要按访问的类型解析,所以指针类型和其所指向的变量类型一致。
    */
    p=&tech1;//使用取地址符将结构体变量的地址给指针p
    printf(p->sex);
    /*
    使用p->sex这样的形式访问成员,这里的箭头与指针搭配。也可以用tech1.sex,或者把tech1换成指针也可以,像这样(*p).sex。
    */
    return 0;
}

Create a struct pointer

//-------------------------------------
//--- struct2.c
//--- 介绍结构体指针,通过指针访问结构体成员值。
//-------------------------------------
#include <stdio.h>
struct teacher
{
    int no;
    char name[10];
    char sex[10];
};

int main(int argc, char const *argv[])
{
    struct teacher tech1;
    struct teacher *p;
    p=&tech1;
    scanf("%d",&(p->no));//p->no通过指针取出了成员变量no;&(p->no)取出了该成员变量的地址
    printf("%d",tech1.no);

    scanf("%s",p->sex);
    /*
    p->sex通过指针取出了字符数组成员变量sex;而p->sex就是字符数组的首地址。如果成员变量sex是指针,像struct1.c那样,那么scanf("%s",p->sex)是行不通的。
    */

    printf("%s",tech1.sex);//也可以用printf(tech1.sex)
    return 0;
}

Create a struct array

//-------------------------------------
//--- struct3.c
//--- 介绍结构体数组
//-------------------------------------
#include <stdio.h>
struct teacher
{
    int     no;
    char    name[10];
    char    sex[10];
}tech[3]={
        {1001,"wang fang", "女"},
        {1002,"zhou yu", "女"},
        {1003,"zhang han", "女"}};
int main(int argc, char const *argv[])
{
    struct teacher *p;
    p=tech;//指针指向结构体数组
    printf("%s",p->sex);
    return 0;
}
/*
p+1表示数组中第2个元素tech[1]的起始地址
*/

Create an union

//-------------------------------------
//--- struct4.c
//--- 介绍共用体(联合体)
//-------------------------------------

#include <stdio.h>
typedef struct
{
    int             no;
    char    name[10];
    char    sex[10];
    int             job;
    union//这是联合体关键字,联合体成员共用一块内存单元,共有首地址,内存单元长度由占用空间最大的成员决定。同一时刻只有一个成员有效。
    {
        int     class;//学生有班级无职称
        char    prof[20];//教师有职称无班级
        //教师和学生只能选择一种属性,故适合用联合体。至于引用,就像这样staf[2].category.class。
    }category;
}STAFFER;
//使用typedef对结构体重新定义后,结构体类型为STAFFER

int main(int argc, char const *argv[])
{
    STAFFER staf[20];
    //code//
    return 0;
}

原文地址:https://www.cnblogs.com/feicaixian/p/9728410.html

时间: 2024-10-10 08:48:57

C语言语法教程-结构体的相关文章

9.Go语言基础之结构体

Go语言中没有类的概念,也不支持"类"的继承等面向对象的概念. Go语言中通过结构体的内嵌再配合接口,比面向对象具有更高的扩展性和灵活性. 1.类型别名和自定义类型 1.1自定义类型 在Go语言中有一些基本的数据类型,如string,整型,浮点型,布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义. //将MyInt定义为int类型 type MyInt int 通过Type关

Go语言基础之结构体

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义.例如: //将MyInt定义为int类型 type MyInt int 通过Type关键字的定义,

关于c语言中的结构体使用偏移量求值问题

最近在看nginx源码,看到定时器的时候,发现一个结构体利用偏移量求值问题, 结构体相信做c开发的都遇到过,那么不知你对结构体中成员变量偏移这块是如何理解的; 首先我们先看一下nginx中的那个让我迷惑的地方 ev =    (event_t*)((char*)node - offsetof(event_t, timer)); 这里,可以得知道是利用event_t结构体的timer变量,来反求event_t结构体的地址 说明一下: event_t是一个结构体 node 也是一个结构体 timer

C语言中的结构体,结构体数组

C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存对齐的问题.也就是内存里面会有空档. 1.结构体的定义和赋值 结构体是可以直接初始化的,在定义的时候,就可以初始化,而且如果你的结构体中恰好有字符数组的话,这个时候初始化是不错的选择,原因很简单,字符数组只能定义的时候直接初始化 后来就不可以了,后来你就只能用strcpy函数来拷贝初始化了. str

浅谈c语言typedef 与结构体指针(个人小经验)

 #include<stdio.h> #include<string.h> typedef struct emp{ char sex[8]; char name[15]; int age; }*emp;//这里我们用typedef把emp这个结构体变成了*emp这种指向结构体成员的结构体指针 /*typedef struct emp{ char sex[8]; char name[15]; int age; }pi,*emp;//为了程序的可读性最好不要这样声明*/ int m

linux 中 C 语言的使用 -- 结构体多态

在 Linux 内核代码,特别是驱动代码中经常见到的用法是使用一个标准结构,后面的代码基于这个结构来实现,类似面向对象的多态特性. 在 C 语言里面借助结构体和函数指针实现的这个功能,这里我们写了个例子,提取了关键代码: #include <stdio.h> struct s_new{ char name[10]; char* (* my_method)(char *name); }; char* powerful(char *name){ printf("%s is powerfu

[汇编与C语言关系]4. 结构体和联合体

用反汇编的方法研究一下C语言的结构体: #include <stdio.h> int main(int argc, char ** argv) { struct { char a; short b; int c; char d; } s; s.a = 1; s.b = 2; s.c = 3; s.d = 4; printf("%u\n", sizeof(s)); return 0; } main函数中几条语句的反汇编结果如下: 从访问结构体成员的指令可以看出,结构体的四个成

黑马程序员 C语言-枚举,结构体,指针

一.枚举 ※枚举变量的定义 前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量. 跟结构体一样,有3种方式定义枚举变量 1.先定义枚举类型,再定义枚举变量 enum Season {spring, summer, autumn, winter}; enum Season s; 2.定义枚举类型的同时定义枚举变量 enum Season {spring, summer, autumn, winter} s; 3.省略枚举名称,直接定义枚举变量 enum {spring, summer

c语言中的结构体指针类型的cast

1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针,并且 在这个结构体中,第一个结构成员必须也是一个结构体(最好是结构体类型). 那么我们可以这个结构体指针转换为指向这个结构体中第一个成员结构体的指针. 直接看代码: ************************************ /* struct transform for struct