C结构体的用法详解

1.

#include<stdio.h>

struct Student//定义结构体
{
    char name[10];
    int age;
};

int main()
{
    struct Student stu;//声明结构体变量
    scanf("%s%d",stu.name,&stu.age);
    printf("%s %d\n",stu.name,stu.age);
    return 0;
}

2.

#include<stdio.h>

struct Student//定义结构体同时声明结构体变量
{
    char name[10];
    int age;
}stu1,stu2;

int main()
{
    scanf("%s%d",stu1.name,&stu1.age);
    printf("%s %d\n",stu1.name,stu1.age);
    return 0;
}

3.

#include<stdio.h>

struct//定义结构体同时声明结构体变量,并省略了结构体类型名,此时不能再以此结构体类型去申明其他变量
{
    char name[10];
    int age;
}stu1,stu2;

int main()
{
    scanf("%s%d",stu1.name,&stu1.age);
    printf("%s %d\n",stu1.name,stu1.age);
    return 0;
}

4.使用typedef的情况

#include<stdio.h>

typedef struct Student
{
    char name[10];
    int age;
}stu1,stu2;//给struct Student取了两个别名

int main()
{
    stu1 stu;
    scanf("%s%d",stu.name,&stu.age);
    printf("%s %d\n",stu.name,stu.age);
    return 0;
}

5.

#include<stdio.h>

typedef struct Student
{
    char name[10];
    int age;
}stu1,stu2[100];//给struct Student取了两个别名

int main()
{
    stu2 stu;//声明了一个长度为100的结构体数组stu
    scanf("%s%d",stu[1].name,&stu[1].age);
    printf("%s %d\n",stu[1].name,stu[1].age);
    return 0;
}

6.解析严蔚敏《数据结构》Page163的代码

typedef struct ArcNode//ArcNode不能省略,因为还要声明struct ArcNode *nextarc;
{
    int adjvex;
    struct ArcNode *nextarc;//使用struct ArcNode 声明变量的原因是struct ArcNode 还没取别名
    InfoType *info;
}ArcNode;

typedef struct VNode
{
    VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct
{
    AdjList vertex;//vertex是长度为MAX_VERTEX_NUM的结构体数组
    int vernum,arcnum;
    int kind;
}ALGraph;

7.关于结构体的自引用

自引用 结构体

1.1 不使用typedef时

错误的方式:

[cpp] view
plain
copy

  1. struct tag_1{
  2. struct tag_1 A;   /* 结构体 */
  3. int value;
  4. };

这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构体,b的内部还会有成员是结构体,依次下去,无线循环。在分配内存的时候,由于无限嵌套,也无法确定这个结构体的长度,所以这种方式是非法的。

正确的方式: (使用指针):

[cpp] view
plain
copy

  1. struct tag_1{
  2. struct tag_1 *A;  /* 指针 */
  3. int value;
  4. };

由于指针的长度是确定的(在32位机器上指针长度为4),所以编译器能够确定该结构体的长度。

1.2 使用typedef 时

错误的方式:

[cpp] view
plain
copy

  1. typedef struct {
  2. int value;
  3. NODE *link;  /* 虽然也使用指针,但这里的问题是:NODE尚未被定义 */
  4. } NODE;

这里的目的是使用typedef为结构体创建一个别名NODEP。但是这里是错误的,因为类型名的作用域是从语句的结尾开始,而在结构体内部是不能使用的,因为还没定义。

正确的方式:有三种,差别不大,使用哪种都可以。

[cpp] view
plain
copy

  1. /*  方法一  */
  2. typedef struct tag_1{
  3. int value;
  4. struct tag_1 *link;
  5. } NODE;
  6. /*  方法二  */
  7. struct tag_2;
  8. typedef struct tag_2 NODE;
  9. struct tag_2{
  10. int value;
  11. NODE *link;
  12. };
  13. /*  方法三  */
  14. struct tag_3{
  15. int value;
  16. struct tag_3
    *link;
  17. };
  18. typedef struct tag_3 NODE;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 10:34:05

C结构体的用法详解的相关文章

可变大小结构体如何定义详解

一.背景 工作中,在通信协议中常常看到TLV格式数据,不同的type id对应的字符串长度大小不一样.那么该怎么去定义一个结构体去管理这些数据呢?怎么去定义一种可变大小的结构体?本文将讲解如何定义可变大小结构体. 二.定义可变大小结构体 1.方法一:使用指针 1 typedef struct _S_HB_TIME_REPORT_INFO 2 { 3 uint16_t msg_id; 4 uint16_t msg_buf_len; 5 char *p_msg_buf; 6 }__attribute

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字. 第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结构体

mapminmax的用法详解 _MATLAB

============外一篇 有关mapminmax的用法详解 by faruto==================================转自:http://www.ilovematlab.cn/thread-47224-1-1.html几个要说明的函数接口:[Y,PS] = mapminmax(X)[Y,PS] = mapminmax(X,FP)Y = mapminmax('apply',X,PS)X = mapminmax('reverse',Y,PS) 用实例来讲解,测试数据

SAFEARRAY基本用法详解

使用ADO技术连接数据库时,经常要用到SAFEARRAY传递参数(我遇到的是向数据库添加数据时,有一种方法要用到SAFEARRAY).我也是花了几天,断断续续的在看SAFEARRAY,刚开始的时候也是非常迷糊,不知道这是什么,只有照着书把代码敲到了电脑上,第二次还是不明白这些代码都做了什么,变量和参数都什么意思.今天下午在网上,书上包括直接在VS上看变量的定义,总算大概了解了点,基本掌握了一维数组的用法,下面是我自己对SAFEARRAY的理解,不当之处,还望之处,不懂之处,欢迎讨论. 首先要知道

STL中的map用法详解

STL中map用法详解 说明:如果你具备一定的C++ template知识,即使你没有接触过STL,这个文章你也应该可能较轻易的看懂.本人水平有限,不当之处,望大家辅正. 一.map概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),

css3中font-face属性的用法详解

@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许多人会不自然的问,这样的东西IE能支持吗?当我告诉大家@font-face这个功能早在IE4就支持了你肯定会感到惊讶.我的Blog就使用了许多这样的自定义Web字体,比如说首页的Logo,Tags以及页面中的手写英文体,很多朋友问我如何使用,能让自己的页面也支持这样的自定义字体,一句话这些都是@fo

js的offsetParent属性用法详解

js的offsetParent属性用法详解:此属性是javascript中较为常用的属性,对于它的良好掌握也是非常有必要的,下面就通过代码实例介绍一下它的用法,希望能够给需要的朋友带来一定的帮助.一.基本介绍:此属性可以返回距离指定元素最近的采用定位(position属性值为fixed.relative或者absolute)父级元素,如果父级元素中没有采用定位的元素,则返回body对象的引用.语法结构: obj.offsetParent 二.代码实例: <!DOCTYPE html> <

offsetleft属性用法详解

offsetleft属性用法详解:本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一下参考.此属性可以返回当前元素距离某个父辈元素左边缘的距离,当然这个父辈元素也是有讲究的.(1).如果父辈元素中有定位的元素,那么就返回距离当前元素最近的定位元素边缘的距离.(2).如果父辈元素中没有定位元素,那么就返回相对于body左边缘距离.语法结构: obj.offsetleft 特别说明:此属性是只读的,不能够赋值.代码实例: <!DOCTYPE html> <html&

Java下static关键字用法详解

Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static 可以修饰: 1. 语句块 2. 成员变量(但是不能修饰局部变量) 3. 方法 4. 接口(内部接口) 5. 类(只能修饰在类中的类, 即静态内部类) 6. jdk 1.5 中新增的静态导入 那么static 修饰的表示什么呢? 当创建一个类时,就是在创建一个新类型,描述这个类的对象的外观和行为,除