精华内容
下载资源
问答
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    c语言中交换两个结构体的值(结构体指针) 1关于语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活...

    渣渣c的c语言学习之路

    1.关于c语言的结构体:

    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。

    2首先我们要了解一些小知识

    2.1**只有结构体变量才分配地址,而结构体的定义是不分配空间的。**
    2.2结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间。
    2.3结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
    2.4c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换
    2.5相同类型的成员是可以定义在同一类型下的
    列如

    
    struct Student
    { 
    	int number,age;//int型学号和年龄
    	char name[20],sex;//char类型姓名和性别
    	float score;
    }

    最后的分号不要忘了 有的编译器会自动加上,因此有的同学就会不注意。

    3关于结构体变量的定义和引用

    在编译时,结构体的定义并不分配存储空间,对结构体变量才按其数据结构分配相应的存储空间

    
     struct Book
     { 
     	char title[20];//一个字符串表
    
    示的titile 题目
    	char author[20];//一个字符串表示的author作者
     	float value;//价格表示 
     };//这里只是声明 结构体的定义 
    struct Book book1,book2;//结构体变量的定义 分配空间
    
    book1.value;//引用结构体变量
    

    定义结构体变量以后,系统就会为其分配内存单元,比如book1和book2在内存中占44个字节(20+20+4)具体的长度你可以在你的编译器中使用sizeof关键字分别求出来。
    列如

    当然,要注意一点:用sizeof关键字求结构体长度时,返回的最大基本类型所占字节的整数倍 比方说我们上面求得的为44 为 float(4个字节)的整数倍,
    但是我们把title修改为title[22]; 这时正常长度为46 ,但是你会发现实际求得的为48,(4的整数倍)

    这就涉及到结构体的存储

    1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。

    2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐,

    关于这个我们简单介绍下:

    1.偏移量----偏移量指的是结构体变量中成员的地址和结构体变量首地址的差。即偏移字节数,结构体大小等于最后一个成员的偏移量加上他的大小,第一个成员的偏移量为0,

    struct S1
    {
        char a;
    
        int b;
    
        double c;
    };
    

    这里char a 偏移量为1 之后为int b 因为偏移量1不为int(4)的整数倍,所以会自动补齐,而在 double c 时,偏移量为8 是double(8)的整数倍,所以不用自动补齐 最后求得结构体得大小为 16

    具体看下图:
    在这里插入图片描述
    通过上面的代码同学们应该会有一个简单的认知

    4结构体变量的初始化

    结构体的初始化有很多需要注意的地方,这里我们说明下
    首先是几种初始化的方法
    ps在对结构体变量初始化时,要对结构体成员一一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’

    4.1定义时直接赋值

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1={"zhaozixuan",'M',12345};
    //或者
    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }struct Student stu1={"zhaozixuan",'M',12345};
    
    

    注意字符为‘ ’ 字符串为""
    4.2定义结构体之后逐个赋值

    stu1.name="王伟";
    stu1.sex='M';
    stu1.number=12305;
    //也可用strcpy函数进行赋值
    strcpy(stu1.name,"王伟");
    
    

    4.3定义之后任意赋值

     struct Student stu1={
      .name="Wang",
      .number=12345,
      .sex='W', 
     };//可以对任意变量赋值
    

    这样写的好处时不用按照顺序来进行初始化,而且可以对你想要赋值的变量直接进行赋值,而不想赋值的变量可以不用赋值

    需要注意的是如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了;

    等下结构体数组初始化时我们还会有一个讲解

    这里我们顺带提一下typedef说明结构体类型


    这里的BOOK就相当于struct book的一个别名一样,用它来定义结构体变量非常简便
    主要也是考二级要用到,所以我们简单介绍下

    5结构体变量的引用(输出和输入)

    5.1结构体变量的赋值用scanf赋值和printf输出时跟其他变量操作一样
    但是有几点需要注意
    (1) .是运算符,在所有运算符优先级中最高
    (2)如果结构体的成员本身是一个结构体,则需要继续用.运算符,直到最低一级的成员。

    struct Student
    {	char name[20];
    	char sex;
    	int number;
    	struct Date
    	{
    		int year;
     		int month;
     		int day;
    	}birthday;
    
    }stu1;
    printf("%d",stu1.birthday);//这样子是错误的,因为birthday也是一个结构体变量
    scanf("%d",&stu1.birthday.month);//正确
    

    (3)可以引用接头体变量成员的地址,也可以引用结构体变量的地址:

    printf("%o", student);(输出student的首地址)(%o 按八进制输出)

    6结构体数组及其初始化(重点)

    这里我们简单说下,具有相同类型的结构体变量组成数组就是结构体数组

    结构体数组与结构体变量区别只是将结构体变量替换为数组

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1[5]={
    	 {"zhaozixuan",'M',12345},
    	 {"houxiaohong",'M',12306},
    	 {"qxiaoxin",'W',12546},
    	 {"wangwei",'M',14679},
    	 {"yulongjiao",'W',17857}
    };
    stu1[3].name[3]//表示stu1的第三个结构变量中姓名的第五个字符
    //若初始化时已经是结构体数组全部元素[]中的数可以不写如stu1[]=
    

    注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的
    比如:

    struct Student stu1;
    stu1[3]={
      {"zhaozixuan",'M',12345},
      {"houxiaohong",'M',12306},
      {"qxiaoxin",'W',12546}
      };
      
    

    这样子是错误的,

    这里我在写的时候遇到一些问题,还是结构体数组初始化的问题,折腾了下解决了,给大家分享下
    对于数组初始化时
    比如

    char str[20];
    str="I love you";/* 这样会修改数组的地址,但是数组的地址分配之后是不允许改变的 */
    
    

    在第一条语句中 str就已经被定义成数组而在C99标准中不允许将字符串(实际上是一个指针变量) 赋值给数组,所以如果我们直接赋值是错误的

    那么怎么弄呢
    这里提供3种方法

    1.定义数组时直接定义
    char str[20]=“I love you”;

    2.用strcpy或者memset函数进行复制
    char str[20];
    strcpy(str,“I love you”);
    再用到memset函数时,出现了一些问题
    对于memcset函数简单介绍下

    memset
    void *memset(void *s,int c,size_t n)
    作用:将已开辟内存空间s的首n个字节的值设为值c。

    char str[20];
    memset(str,'a',20);
    

    如果是字符类型数组的话,memset可以随便用,但是对于其他类型的数组,一般只用来清0或者填-1,如果是填充其他数据就会出错

    int str[10];
    memset(str,1,sizeof(str));//这样是错误的
    
    

    这里我们说下这个错误,

    首先我们要知道memset在进行赋值时,是按字节为单位来进行赋值的,每次填充的数据长度为一个字节,而对于其他类型的变量,比如int,占4个字节 所以sizeof(str)=40; 而用memset赋值时,将会对指向str地址的前40个字节进行赋值0x01(00000001) 的操作,把0x00000000赋值4次0x01操作变为0x01010101(00000001000000010000000100000001)

    相当于给“前10个int”进行了赋值0x01010101的操作 对应十进制的16843009
    所以会出很大的错误

    这里请务必要注意,但是如果是清零一个数组用memset还是很方便的
    简单使用的话同学们用strcmp函数就行

    3用指针(注意内存分配)
    char *str;
    str=“I love you”;

    这两句话的本质是,在内存中开辟一段内存空间,把"I love you"放进这段内存空间,然后把这段内存空间的地址交给str,由于str是变量,所以给它赋值是合法的。

    请注意,在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值
    这里我们在4小节中也提到了
    比如

    int str[10]={1};//这里只是把str的第一个元素赋值为1,其他元素默认为0
    
    



    7结构体与指针

    我们知道,指针指向的是变量所占内存的首地址,在结构体中,指针指向的是结构体变量的起始地址,当然也可指向结构体变量的元素
    这里我们分为三部分
    7.1指向结构体变量的指针

    定义形式一般为
    struct 结构体名* 指针名;
    比如: struct Student* p;

    struct Student
    {	
    	char cName[20];
     	int number;
     	char csex;  
    }student1;
    struct Student*p;
    p=&student1;
    //若为结构体数组则
    struct Student stu1[5];
    struct Student*p;
    p=stu1;//因为stu1为结构体数组而p=stu1直接是指向stu1的首地址,就不用再加&符
    
    

    用结构体指针变量访问结构体变量成员有以下两种方式:
    (*p).cName //这里的括号不能少,在5.1中有提到
    p->cName

    简单来说以下三种形式是等价的

    p->cName
    (*p).cName 
    student1.cName
    p->cName //可以进行正常的运算
    

    p->number++; 是将结构体变量中number的值进行运算,然后再加一,
    这里要注意下,等下在7.2中会有比较

    7.2指向结构体数组的指针

    7.1中我们已经提到结构体数组指针的命名,这里我们仅对一些知识点做下介绍
    这里我们接着来说结构体数组指针
    在我们想要用指针访问结构体数组的第n个数据时可以用

    struct Student stu1[5];
    struct Student*p;
    p=stu[n];
    (++p).number//是指向了结构体数组下一个元素的地址
    
    

    7.3结构体成员是指针类型变量
    比如

    struct Student
    {
     	char* Name;//这样防止名字长短不一造成空间的浪费
     	int number;
     	char csex;  
    }student1;
    
    

    在使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址,如果你不分配地址,结果可能是对的,但是Name会被分配到任意的一的地址,结构体不为字符串分配任何内存存储空间具有不确定性,这样就存在潜在的危险,

    struct Student
    {
     	char* Name;
     	int number;
     	char csex;  
    }stu,*stu;
    
    stu.name=(char*)malloc(sizeof(char));//内存初始化
    

    这里我们说一下,同学们看书的时候一般不会看到,
    如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存

    struct Student
    {
     	char* Name;
     	int number;
    	char csex;  
    }stu,*stu;
    stu = (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
      stu->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/  
    
    

    7.4二叉树遍历算法
    二叉树的二叉链表类型定义如下:
    typedef struct btnode {
    datatype data;
    struct btnode *lchild,*rchild;
    };
    这里我们仅仅提出以下,因为涉及到链表,感兴趣的同学可以去学习下(二级要用),
    7.5结构体作为函数参数

    首先我们要注意的一点,使用结构体变量作为函数参数的时候,采取的是值传递的方式,将结构体所占内存单元的内容全部传递给形参,并且形参必须也要是同类型的结构体变量,在使用时,会自动创建一个结构体变量作为原变量的副本,并且也需要占内存,并且在调用期间如果修改(形参)结构体中成员的值,修改值是无效的

    而如果用指针作为实参,传递给函数的形参,这时候传递的是结构体的地址,形参所指向的地址就是结构体变量的地址,这时候进行修改的话是可以修改的,这正是指针的精华所在

    在这里我们再提供几种互换两个结构体的方法

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }student1,student2;
    struct Student student1={"Wang",12345,'W'};
    struct Student student2={"Zhao",54321,'M'}; 
    struct Student*stu1=&student1;
    struct Student*stu2=&student2;
    
    struct Student *student3;
    student3=stu1;
    stu1=stu2;
    stu2=student3;//互换地址
    
    2对于同类型结构体直接互换值就行
    struct stu student3;
    student3=student1;
    student1=student2;
    student2=student3;
    //这里也可以写成应strcmp函数互换
    
    3memcpy()函数进行互换
    
    
    4比较笨的方法: 用for循环互换
    

    最后提下memset清空结构体

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }stu1;
    
    一般情况下,清空str的方法:
      str.cName[0]='\0';
      str.csex='0';
      str.number=0;
      但是我们用memset就非常方便:
      memset(&str,0,sizeof(struct Student));
      如果是数组:
      struct Student stu[10];
      就是
      memset(stu,0,sizeof(struct Student)*10);
    

    整理不易,点个赞再走呗!

    展开全文
  • C语言中结构体初始化

    2020-06-19 10:11:57
    结构体定义: struct member{ int one; float two; char* three; double four;...顺序与结构体定义的顺序相同。 2.C风格乱序(定义后创造结构体实例时) struct member test={ .two=2.34, .

    结构体定义:

    struct member{
        int one;
        float two;
        char* three;
        double four;
    };

    1.顺序(定义后创造一个结构体实例时)

    struct member test={
        1,
        2.34,
        "a test",
        2.333
    };

     顺序与结构体定义中的顺序相同。

    2.C风格乱序(定义后创造结构体实例时)

    struct member test={
        .two=2.34,
        .one=1,
        .four=2.333,
        .three="a test"
    };

    无需注意顺序。

    3.C++风格乱序(定义后创造结构体实例时)

    struct member test={
        two:2.34,
        one:1,
        four:2.333,
        three:"a test"
    };

    无需注意顺序。

    注意:三种形式都允许初始化部分成员,未初始化的成员赋0或NULL。

    展开全文
  • C语言结构体初始化的几种方法

    千次阅读 2021-06-02 09:26:46
    结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍 二、常规初始化(先定义再初始化) typedef struct { int bandrate; int databits; int stopbits; int parity; int dtr; }serial_...

    一、介绍
    结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍

    二、常规初始化(先定义再初始化)

    typedef struct {
        int bandrate;
        int databits;
        int stopbits;
        int parity;
        int dtr;
    }serial_hard_config_def;
    
    serial_hard_config_def serial;
    serial.bandrate = 115200;
    serial.databits = 8;
    serial.stopbits = 1;
    serial.parity = 0;
    serial.dtr = 0;
    

    三、定义的同时初始化
    1、顺序初始化

    typedef struct {
        int bandrate;
        int databits;
        int stopbits;
        int parity;
        int dtr;
    }serial_hard_config_def;
    
    serial_hard_config_def serial = {
    	115200,
    	8,
    	1,
    	0,
    	0
    };
    
    

    2、乱序初始化

    typedef struct {
        int bandrate;
        int databits;
        int stopbits;
        int parity;
        int dtr;
    }serial_hard_config_def;
    
    serial_hard_config_def serial = {
    	.dtr = 0,
    	.bandrate = 115200,
    	.databits = 8,
    	.stopbits = 1,
    	.parity = 0,
    };
    

    3、结构体数组初始化

    typedef struct {
        int bandrate;
        int databits;
        int stopbits;
        int parity;
        int dtr;
    }serial_hard_config_def;
    
    serial_hard_config_def serial[2] = {
    	[0] = {
    		.dtr = 0,
    		.bandrate = 115200,
    		.databits = 8,
    		.stopbits = 1,
    		.parity = 0,
    		},
    	[1] = {
    		.dtr = 0,
    		.bandrate = 115200,
    		.databits = 8,
    		.stopbits = 1,
    		.parity = 0,
    	}
    };
    

    4、嵌套结构体初始化

    typedef struct {
        int bandrate;
        int databits;
        int stopbits;
        int parity;
        int dtr;
    }serial_hard_config_def;
    
    typedef struct {
        serial_hard_config_def hardware;
        int model;
     
    }serial_config_def;
    
    serial_config_def serial_config = {
    	{
    		.dtr = 0,
    		.bandrate = 115200,
    		.databits = 8,
    		.stopbits = 1,
    		.parity = 0,
    	},
    	.model = 1
    }
    

    5、嵌套结构体数组初始化

    typedef struct {
        int bandrate;
        int databits;
        int stopbits;
        int parity;
        int dtr;
    }serial_hard_config_def;
    
    typedef struct {
        serial_hard_config_def hardware;
        int model;
     
    }serial_config_def;
    
    serial_config_def serial_config[2] = {
    	[0] = {
    			{
    				.dtr = 0,
    				.bandrate = 115200,
    				.databits = 8,
    				.stopbits = 1,
    				.parity = 0,
    			},
    			.model = 1,
    		},
    	[1] = {
    			{
    				.dtr = 0,
    				.bandrate = 115200,
    				.databits = 8,
    				.stopbits = 1,
    				.parity = 0,
    			},
    			.model = 1,
    		}	
    }
    
    展开全文
  • 《代码大全》建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化。1、初始化 代码如下:typedef struct _TEST_T { int i; char c[10];}...
  • <p style="text-align:center"><img alt="" height="3024" src="https://img-ask.csdnimg.cn/upload/1622962986423.jpeg" width="4032" /></p>  </p>
  • C语言 - 数组与结构体初始化方法与区别 说明 本文的测试均在VS2015的开发环境下测试。 数组与结构体初始化方法 假设结构体为: struct Node { int a; int b; int c; }; 1.定义变量后,再初始化 int array[5]; ...

    C语言 - 数组与结构体初始化方法

    说明

    本文的测试均在VS2015的开发环境下测试。

    数组与结构体初始化方法

    假设结构体为:

    struct Node {
           int a;
           int b;
           int c;
    };
    
    1.定义变量后,再初始化
    int array[5];
    
    array[0] = 0;
    array[1] = 1;
    array[2] = 2;
    array[3] = 3;
    array[4] = 4;
    //也可以用循环来赋值
    
    struct Node node;
    
    node.a = 0;
    node.b = 1;
    node.c = 2;
    //不好用循环来赋值
    

    这样方便初始化不同的值,但较为麻烦。

    2.花括号初始化
    int array[5] = {0, 1, 2, 3, 4};
    
    struct Node node = {0, 1, 2 };
    

    这样,将依次对元素(成员)赋值。

    如果花括号里的元素少于数组长度(成员个数),那么数据剩下的数组(成员)将为默认为0。

    利用这个特性,可以方便地全部初始化为0,例如:

    int array[5] = { 0 };//因为赋值的元素只有一个,小于数组长度5;故数组第一个位置(array[0])手动初始化为0,其他位置默认初始化为0.
    
    struct Node node = { 0 };//因为赋值的元素只有一个,小于成员数;故结构体第一个成员初始化为0,其他成员默认初始化为0.
    
    3.memset初始化为0

    该方法只适合将数据全部初始化为0。

    memset原型:

    void *memset(void *s, int ch, size_t n);

    memset函数以字节为单位,将 s 指向的 n 个字节空间,全部置为0。
    例如,

    int array[5];
    memset( array, 0, sizeof( array) ); //数组全部初始化为0
    memset( array, 1, sizeof( array) ); //数据并未初始为1,而是初始化为16843009
    // 16843009 对应的16进制为:0x01 01 01 01
    
    struct Node node;
    memset( &node, 0, sizeof( struct Node ) ); //数组全部初始化为0
    

    数组和结构体不初始化会出现什么结果?

    数组会出现随机值,如图:
    在这里插入图片描述

    结构体不初始化,编译不会报错,但是运行时会出错:
    在这里插入图片描述


    一种错误”初始化“结构体方法…不过还是建议了解下

    结构体为:

    struct Node {
           int a;
           int b;
           int c;
           int d;
           int e;
    };
    
    结构体乱序初始化:
    struct Node node = {
           node.a = 1,
           node.b = 2,      
           node.c = 3,
           node.d = 4,
           node.e = 5
    };
    

    结构体初始化结果:

    a = 1
    b = 2
    c = 3
    d = 4
    e = 5
    请按任意键继续. . .
    
    结构体乱序初始化:
    struct Node node = {
           node.a = 1,
           node.c = 3,      // 注意,node.b和node.c的初始化顺序交换了
           node.b = 2,
           node.d = 4,
           node.e = 5
    };
    

    结构体初始化结果:

    a = 1
    b = 2
    c = 2
    d = 4
    e = 5
    请按任意键继续. . .
    

    可以看出这样初始化方法,顺序初始化,结果是正确的;但是一旦乱序,结果就错误了,乱序初始化的元素会相互影响。

    原因

    我们先看一个小例子:

           int a = 0, b = 0;
           b = a = 7;       // 该语句完成后,a 和 b 均为 7.
    

    这种初始化方法,其实属于花括号初始化的方法;再把逗号之间看作一条语句,则有:

    struct Node node = {
          (node.a = 1,    // 语句1
          (node.c = 3,    // 语句2
          (node.b = 2,    // 语句3
          (node.d = 4,    // 语句4
          (node.e = 5// 语句5
    };
    

    这样就相对容易理解了。

    语句1:
    先给node.a赋1;又因为语句1在花括号的第一个位置上,故将node.a赋给node结构体的第一个成员(node.a),即可以理解为 node.a=node.a=1;故node.a=1。

    语句2:
    先给node.c赋3;又因为语句2在花括号的第二个位置上,故将node.c赋给node结构体的第二个成员(node.b),即可以理解为 node.b=node.c=3;故node.b=3。

    语句3:
    先给node.b赋2;又因为语句3在花括号的第三个位置上,故将node.b赋给node结构体的第三个成员(node.c),即可以理解为 node.c=node.b=2;故,此时 node.b=2,node.c=2。

    语句4:
    先给node.d赋4;又因为语句4在花括号的第四个位置上,故将node.d赋给node结构体的第四个成员(node.d),即可以理解为 node.d=node.d=4;故node.d=4。

    语句5:
    先给node.e赋5;又因为语句5在花括号的第五个位置上,故将node.e赋给node结构体的第五个成员(node.e),即可以理解为 node.e=node.e=5;故node.e=5。

    这样“初始化”完成后,结构体的a,b,c,d,e就分别为:1, 2, 2, 4, 5。
    所以说这是中错误的"初始化"方法。


    结构体初始化是否有其他乱序初始化方法?

    如参考资料[1]所说,C语言结构体初始化可以乱序赋值;但是我在VS2015上测试中,发现参考资料[1]中的方法三、方法四,并不能通过编译。

    所以我猜测这种乱序初始化的方法可能是Linux C的方法,回头测试了,在写在这。

    补充:

    我在linux C下编程测试了下,参考资料[1]中的方法三、方法四均是Linux C的方法;并且可以实现乱序初始化。

    经查资料得知,下图中的第一种乱序初始化方法(注释掉的部分)是C99支持的;第二种乱序初始化方法(未注释掉的)是GCC支持的方法。

    由于VS2015不支持C99,编译器也不是GCC,所以这两种方法都不支持。

    在这里插入图片描述


    参考资料

    [1]C语言结构体初始化的四种方法https://blog.csdn.net/ericbar/article/details/79567108

    展开全文
  • C语言结构体初始化

    千次阅读 2018-11-06 19:32:26
    C语言结构体初始化
  • 1、直接对整个结构体进行初始化: struct stu xiaoming = {"xiaoming",10}; 2、通过结构体的各个元素进行单独初始化: struct stu xiaowang; strcpy(xiaoming.name,"xiaoming"); xiaoming.age = 10; 3、通过另...
  • 方法三:定义时乱序赋值(C风格) 这种方法类似于第一种方法和第二种方法的结合体,既能初始化时赋值,也可以不考虑顺序; struct InitMember test = { .second = 3.141590, .third = "method three", .first = -10...
  • C语言结构体初始化的小技巧

    千次阅读 2019-12-21 10:53:44
    我们使用C去新建结构体变量时,如果这个变量是局部变量,那么其成员变量的默认初始值就是随机值,所以一般在创建变量时会对其成员的值进行初始化。下面举例说明这个过程, 一 常规初始化 假设结构体类型定义如下, ...
  • ``` #include #include struct stu ...结构体必须要初始化吗?在声明完一个结构体变量后,不是已经在内存申请了空间了吗,为啥不能够直接输出st.a必须要初始化,虽然不初始化里面的内容 不确定。
  • C语言结构体初始化的四种方法 ericbars 2018-03-15 17:17:19 160301 收藏 183 分类专栏: 技术基础 文章标签: 结构体初始化 C语言 版权 定义 struct InitMember { int first; double second; char* third; ...
  • 1、先定义结构体类型后再定义结构体变量; 格式为;struct 结构体名 变量名列表; structbook s1,s2,*ss;//注意这种之前要先定义结构体类型后再定义变量; 2、在定义结构体类型的同时定义结构体变量; ...
  • C语言结构体初始化的三种方法

    万次阅读 2015-03-30 19:46:38
    // method 2: 指定初始化,成员顺序可以不定,Linux 内核多采用此方式 struct student_st s2 = { .name = "YunYun", .c = 'B', .score = 92, }; show_student(&s2); // method 3: 指定初始化,成员...
  • C语言结构体初始化 定义: struct 结构体名 { //成员列表 类型名 成员名 } //变量列表 使用 “.” ,调用结构体各项成员,完成基本操作 结构体数组初始化 #include&lt;iostream&gt; using ...
  • C语言--结构体初始化

    2018-12-25 11:08:31
    一、结构体基本初始化方法 定义 struct Mystruct { int first; double second; char* third; float four; }; 1、方法一:定义时赋值 赋值时注意定义时各个成员的顺序,不能错位。 struct Mystruct test ...
  • C语言--memset结构体初始化

    万次阅读 2019-05-30 22:21:16
    memset可以方便的清空一个结构类型的变量或数组。如:  struct sample_struct  {  char csName[16];  int iSeq;  int iType;  }; 对于变量 struct sample_strcut stTest; 一般情况下,清空stTest的...st...
  • ``` #include #include struct stu { int a; char b;...结构体在使用它时,必须要初始化吗,在声明完变量st后不是已经分配空间了吗? 直接输出其中的st.a为什么不行,虽然其中的只不确定。
  • C语言结构体数组初始化 一、使用场景 在C编码,经常需要对结构体数组进行初始化。 使用这种方法,能够使得代码更加的清晰,易读。 例如:需要根据返回码,一个status code 做不同的操作。 int process_by_status...
  • C语言中结构体初始化

    万次阅读 多人点赞 2013-03-02 21:23:12
    《代码大全》建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化。1、初始化typedef struct _TEST_T { int i; char c[10];}TEST_T;TEST_T...
  • //因为第一行已经对第一个元素赋值了,因此,剩下需要初始化的空间大小为sizeof(struData)-1 //即需要初始化A4h-1=A3h的长度,而CPU每次对dword(4字节)的长度进行初始化, rep stos dword ptr [edi] //初始化的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,226
精华内容 22,490
关键字:

c语言中结构体初始化

c语言 订阅