精华内容
下载资源
问答
  • 通过形参赋值,可以有两种方式,一种是使用一级指针,一种是使用二级指针。 使用一级指针进行赋值时,在原调用体内声明一个此结构体类型的变量,再用取地址获得变量的指针传达赋值函数内进行赋值。例子如下: #...

    例有结构体

    struct POINT {
    	int a;
    	int b;
    }
    

    *如何通过函数对其进行赋值 *

    通过形参赋值,可以有两种方式,一种是使用一级指针,一种是使用二级指针。

    1. 使用一级指针进行赋值时,在原调用体内声明一个此结构体类型的变量,再用取地址获得变量的指针传达赋值函数内进行赋值。例子如下:
    #include <iostream>
    using namespace std;
    struct POINT {
        int a;
        int b;
    };
    void AssignPoint(POINT* p_pstPoint) {
        p_pstPoint->a = 1;
        p_pstPoint->b = 2;
    }
    int main() {
        POINT stPoint;
        AssignPoint(&stPoint);
        cout << stPoint.a << " " << stPoint.b << endl;
        return 0;
    }
    
    1. 使用二级指针时,则需要在调用体或者赋值体内对二级指针指向一级指针的内存进行申请。例子如下。第16行注释或不注释都行
      此种方法需要自己维护内存
    #include <iostream>
    using namespace std;
    struct POINT {
        int a;
        int b;
    };
    void AssignPoint(POINT** p_ppstPoint) {
        if((*p_ppstPoint) == nullptr) {
            (*p_ppstPoint) = (POINT*)malloc(sizeof(POINT));
        }
        (*p_ppstPoint)->a = 1;
        (*p_ppstPoint)->b = 2;
    }
    int main() {
        POINT* pstPoint = nullptr;
        pstPoint = (POINT*)malloc(sizeof(POINT));
        AssignPoint(&pstPoint);
        cout << pstPoint->a << " " << pstPoint->b << endl;
        return 0;
    }
    

    分析一下两种实现方式的原理和区别个人理解仅供参考

    • 使用第一种方式时在main函数内声明的stPoint变量存放在栈空间,并在栈空间开辟了一块空间用于存放POINT数据。
      此时对stPoint取地址得到它所在的地址(也就是所谓的一级指针,此指针指向POINT的栈空间)。将此地址作为实参传递给p_pstPoint时,p_pstPoint有自己的栈地址,其指向POINT的栈空间。所以stPoint和p_pstPoint指向同样的栈地址,所以对p_pstPoint指向的栈地址赋值,stPoint也能取到。当stPoint作用域结束时,这块栈空间自动被释放掉。
    • 使用第二种方式时在main函数声明的pstPoint 初始化指向nullptr空间。也就是pstPoint 有自己的栈地址,其指向一个为空的堆空间。再通过malloc对其分配堆空间使其指向一个部位

    通过返回值进行赋值

    通过返回结构体指针或者返回结构体变量

    展开全文
  • C++ 结构体初始化与赋值

    万次阅读 多人点赞 2016-05-30 13:28:57
    1.CC++结构体的初始化今天看到项目中对自定义结构体初始化方式有点陌生,特在此...}有几种初始化方式:第一种:struct A a = { .b = 1, .c = 2 };第二种:struct A a={ b:1, c:2 };第三种:struct A a1 =

    1.结构体初始化

    结构体是常用的自定义构造类型,是一种很常见的数据打包方法。结构体对象的初始化有多种方式,分为顺序初始化、指定初始化、构造函数初始化。假如有如下结构体。

    struct A {
    	int b;
    	int c;
    };
    

    (1)顺序初始化因为书写起来较为简约,是我们最常用的初始化方式,但相对于指定初始化,无法变更数据成员初始化顺序,灵活性较差,而且表现形式不直观,不能一眼看出 struct 各个数据成员的值。

    A a = {1, 2};
    

    (2)指定初始化(Designated Initializer)实现上有两种方式,一种是通过点号加赋值符号实现,即“.fieldname=value”,另外一种是通过冒号实现,即“fieldname:value”,其中 fieldname 为结构体成员名称 。前者是 C99 标准引入的初始化方式,后者是 GCC 的扩展。遗憾的是有些编译器并不支持指定初始化,比如 Visual C++。

    // 点号+赋值符号
    A a = {.b = 1, .c = 2};
    
    //冒号
    A a = {b:1, c:2};
    

    Linux 内核喜欢用 .fieldname=value 的方式进行初始化,使用指定初始化,一个明显的优点是成员初始化顺序和个数可变,并且扩展性好,比如在结构体非末尾处增加字段时,避免了传统顺序初始化带来的大量修改。

    (3)构造函数初始化常见于 C++ 代码中,因为 C++ 中的 struct 可以看作 class,结构体也可以拥有构造函数,所以我们可以通过结构体的构造函数来初始化结构体对象。给定带有构造函数的结构体:

    struct A {
    	A(int b,int c) {
    		this->b=b;
    		this->c=c;
    	};
    	int b;
    	int c;
    }
    

    那么结构体对象的初始化可以像类对象初始化那样:

    A a(1,2);
    

    注意: struct 如果定义了构造函数的话,就不能用大括号进行初始化了,即不能再使用指定初始化与顺序初始化了。

    2.结构体赋值

    变量的赋值和初始化是不一样的,初始化是在变量定义的时候完成的,是属于变量定义的一部分,赋值是在变量定义完成之后想改变变量值的时候所采取的操作。还是给定结构体 A:

    struct A {
    	int b;
    	int c;
    };
    

    注意: 结构体变量的赋值是不能采用大括号的方式进行赋值的,例如下面的赋值是不允许的。

    A a;
    a={1,2};	// 错误赋值
    

    下面列出常见结构体变量赋值的方法。

    (1)使用 memset 对结构体变量进行置空操作:

    // 按照编译器默认的方式进行初始化(如果 a 是全局静态存储区的变量,默认初始化为0,如果是栈上的局部变量,默认初始化为随机值)
    A a; 
    memset(&a,0,sizeof(a));
    

    (2)依次给每一个结构体成员变量进行赋值:

    A a; 
    a.b=1;
    a.c=2;
    

    (3)使用已有的结构体变量给另一个结构体变量赋值。也就是说结构体变量之间是可以相互赋值的。

    A a={1,2};
    struct A a1;
    a1=a; 				// 将已有的结构体变量赋给a1
    

    初始化与赋值有着本质的区别,初始化是变量定义时的第一次赋值,赋值则是定义之后的值的变更操作,概念上不同,所以实现上也不一样。


    参考文献

    [1] 2016腾讯春季校园实习招聘技术岗初试(一面)问题汇总(CC++后台)
    [2] 结构体初始化
    [3] C结构体-designated initializer
    [4] C语言结构体声明中冒号的使用(占位符) & C结构体的乱序初始化

    展开全文
  • 结构体初始化的几种方式 无构造方法的结构体初始化 创建一个结构体 struct STUDENT { string name; int age; string sex; } 定义时赋值 // 定义时赋值,通过大括号 // 没有构造方法的结构体是不能使用小括号的...

    结构体初始化的几种方式

    无构造方法的结构体初始化

    创建一个结构体
    struct STUDENT {
    	string name;
    	int age;
    	string sex;
    }
    
    定义时赋值
    // 定义时赋值,通过大括号
    // 没有构造方法的结构体是不能使用小括号的方式进行赋值的
    struct STUDENT stu1 = {"tako", 22, "女"};
    
    定义时乱序赋值(.attribute = value)
    // 使用 .= 进行赋值
    struct STUDENT stu3 = {
            .name = "tako",
            .age = 22,
            .sex = "女"
    };
    
    定义时乱序赋值(attribute : value)
    // 使用 : 进行赋值
    struct STUDENT stu4 = {
            name : "tako",
            age : 22,
            sex : "女"
    };
    
    先创建再赋值
    int main() {
    	struct STUDENT student;
    	student.name = "tako";
    	student.age = 22;
    	student.sex = "女";
    }
    

    有构造方法的结构体初始化

    有构造方法的结构体不能使用乱序赋值,也就是不能针对指定的属性名进行赋值。

    创建一个结构体
    struct TEACHER {
        string name;
        int age;
        string sex;
        // 无参构造方法
        TEACHER() { };
        // 有参构造方法
        TEACHER(string name, int age, string sex) : name(name), age(age), sex(sex) { };
    };
    
    定义时赋值(跟无构造方法的结构体不同)

    与无构造方法的结构体相比,有构造方法的结构体在定义时赋值的方式可以有更多种,不仅可以通过 (attr1, attr2) 也可以通过 {attr1, attr2} 的方式进行赋值。

    // 创建老师结构体对象,这个结构体是有构造方法的
    struct TEACHER teacher4("tako", 22, "男");
    struct TEACHER teacher3 = TEACHER("tako", 22, "男");
    struct TEACHER teacher2 = {"tako", 22, "男"};
    struct TEACHER *teacher1 = new TEACHER("tako", 22, "男");
    
    先定义再赋值(需要有无参构造方法)
    struct TEACHER teacher;
    teacher.name = "tako";
    teacher.age = 22;
    teacher.sex = "男";
    

    展开全文
  • CC++结构体初始化与赋值

    万次阅读 2018-03-01 09:38:31
    1.CC++结构体的初始化今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列...}1234有几种初始化方式:第一种:struct A a = { .b = 1, .c = 2 };1234第二种:struct A a={ b:1, c:2 };1234第三种:...

    1.CC++结构体的初始化

    今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列一下可用的结构体初始化的方式。

    对结构体

    struct A {
        int b;
        int c;
    }
    • 1
    • 2
    • 3
    • 4

    有几种初始化方式:

    第一种:

    struct A a = {
        .b = 1,
        .c = 2
    };
    • 1
    • 2
    • 3
    • 4

    第二种:

    struct A a={
        b:1,
        c:2
    };
    • 1
    • 2
    • 3
    • 4

    第三种:

    struct A a1 = { 1, 2};
    • 1

    Linux内核喜欢用第一种,使用第一种和第二种时,成员初始化顺序可变。

    第四种: 
    因为C++中的struct可以看作class,结构体也可以拥有构造函数,所以我们可以通过结构体的构造函数来初始化结构体对象。

    给定带有构造函数的结构体:

    struct A {
        A(int a,int b){
            this->a=a;
            this->b=b;
        };
        int b;
        int c;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    那么结构体对象的初始化可以像类对象的初始化那样,如下形式:

    struct A a(1,2);
    • 1

    注意: struct如果定义了构造函数的话,就不能用大括号进行初始化了,即不能再使用前三种初始化的方式了。

    2.CC++结构体的赋值

    变量的赋值和初始化是不一样的,初始化是在变量定义的时候完成的,是属于变量定义的一部分,赋值是在变量定义完成之后想改变变量值的时候所采取的操作。

    还是给定结构体A:

    struct A {
        int b;
        int c;
    }
    • 1
    • 2
    • 3
    • 4

    注意:结构体变量的赋值是不能采用大括号的方式进行赋值的,例如下面的赋值是不允许的。

    struct A  a;
    //错误赋值
    a={1,2};
    • 1
    • 2
    • 3

    下面列出常见结构体变量赋值的方法。

    第一种: 
    使用memset对结构体变量进行置空操作:

    //按照编译器默认的方式进行初始化(如果a是全局静态存储区的变量,默认初始化为0,如果是栈上的局部变量,默认初始化为随机值)
    struct A a; 
    memset(&a,0,sizeof(a));
    • 1
    • 2
    • 3

    第二种: 
    依次给每一个结构体成员变量进行赋值:

    struct A a; 
    a.b=1;
    a.c=2;
    • 1
    • 2
    • 3

    第三种: 
    使用已有的结构体变量给另一个结构体变量赋值。也就是说结构体变量之间是可以相互赋值的。

    struct A a={1,2};
    struct A aa;
    aa=a;               //将已有的结构体变量付给aa
    • 1
    • 2
    • 3

    参考文献

    [1] 2016腾讯春季校园实习招聘技术岗初试(一面)问题汇总(CC++后台) 
    [2] 结构体初始化

    展开全文
  • C++ 结构体

    千次阅读 多人点赞 2018-07-11 10:04:12
    定义结构体变量的几种方式; 访问结构体变量以及结构体变量赋值; 定义结构体变量,编译器会分配多大内存的空间。 结构体的定义 a. 结构体出现的背景 为了表示一些复杂的数据,普通的基本变量无法满足需求。 b. ...
  • 结构体初始化

    2014-05-06 09:37:42
    结构体初始化, ...有几种初始化方式: struct a a1 = {  .b = 1,  .c = 2 }; 或者 struct a a1 = {  b:1,  c:2 } 或者 struct a a1 = { 1, 2}; //必须顺序赋值 内核喜欢用第一种,使用第
  • 个小问题

    2013-08-06 12:57:43
    种方式:  静态初始化:一般是静态变量时,如果用于初始化结构体中的某个成员变量时,只能在创建结构体变量时使用(注意不是赋值)。  动态初始化: 该函数用于C函数的多线程编程中,互斥锁的初始化。  ...
  • 如下是工作学习中遇到的一些实用的知识点梳理,多来自网络转载,编程之路不易,与大家共勉。 ...2,结构体成员的赋值几种方式: http://www.imooc.com/wenda/detail/340567 … 后续待补充! ...
  • 变量声明: Go语言的程序实体包含:变量、常量、函数、结构体和接口,是一门静态类型的编程语言。 (在声明变量或常量的时候,需要指定类型,或者给予...面试题:变量声明赋值几种方式? 1.用关键字 var v...
  • 一、首先,数组,我们将从数组的定义、数组的赋值、数组的长度、数组的遍历这个方面来讨论。(这里只说一维数组) 首先我们定义一个数组, #include void main(){ /* 在定义数组的时候,一种方式是指定数组的...
  • Go语言中的程序实体包括变量,常量,函数,... 声明变量有几种方式 1.声明变量且声明变量类型 先看如下代码  如上var name string是基本的变量声明语法 2.不声明变量类型,直接=赋值 var name = *flag...
  •  5.6几种循环的比较  5.7改变循环执行的状态  5.7.1用break语句提前终止循环  5.7.2用continue语句提前结束本次循环  5.7.3break语句和continue语句的区别  5.8循环程序举例  习题 第6章;利用数组处理批量...
  • 152_结构体2_如何定义结构体[3种方式] 151_结构体1_为什么需要结构体 什么叫结构体【重点】 150_指针_30_跨函数使用内存习题测试【重点】 149_指针_29_动态内存可以跨函数使用详解【重点】用 148_指针_28_静态变量不...
  • 6.7 几种循环的比较 6.8 break语句和continue语句 6.8.1 break语句 6.8.2 continue语句 6.9 程序举例习题 7 数组 7.1 一维数组的定义和引用 7.1.1 一维数组的定义 7.1.2 一维数组元素的引用 7.1.3 一线...
  • C程序设计(第四版).谭浩强.扫描版

    热门讨论 2011-05-31 10:02:13
    5.6几种循环的比较125 5.7改变循环执行的状态125 5.7.1用break语句提前终止循环126 5.7.2用continue语句提前结束本次循环127 5.7.3break语句和continue语句的区别128 5.8循环程序举例131 习题140 第6章 利用数组...
  • C程序设计(第四版)【谭浩强】

    热门讨论 2011-05-25 15:55:43
    5.6几种循环的比较125 5.7改变循环执行的状态125 5.7.1用break语句提前终止循环126 5.7.2用continue语句提前结束本次循环127 5.7.3break语句和continue语句的区别128 5.8循环程序举例131 习题140 第6章 利用数组...
  • 5.6 几种循环的比较 5.7 改变循环执行的状态 5.7.1 用break语句提前终止循环 5.7.2 用continue语句提前结束本次循环 5.7.3 break语句和continue语句的区别 5.8 循环程序举例 习题 第6章 利用数组处理批量数据 6.1 ...
  • Golang2-new.docx

    2020-02-18 14:06:11
    13.1. GoLang几种读文件方式的比较 197 14. 个人 197 14.1. ++,-- 198 14.2. 逗号 198 14.3. 未使用的变量 199 14.4. Effective go 199 14.4.1. 指针 vs. 值 199 14.5. 可寻址性-map和slice的区别 201 ...
  • c++ 程序设计

    2019-01-20 22:53:37
    3.11.4 几种循环的比较 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序 习题 第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.2.1 定义无参函数的一般形式 4.2.2 定义有参函数的...
  • 56.7 几种循环的比较 79 6.8 break 和 continue语句 79 6.8.1 break 语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 7.1.1 一维数组的定义方式 82 7.1.2 一维数组元素的引用 ...
  • 56.7 几种循环的比较 79 6.8 break 和 continue语句 79 6.8.1 break 语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 7.1.1 一维数组的定义方式 82 7.1.2 一维数组元素的引用 ...
  • 对了,截至目前为止我尝试的思路有以下几种,在此列出也是希望大家能帮忙指点一下(尤其是思路2和思路3是否可行),十分感谢: 1、将info定义为Object,赋值、传参时全部以Object进行操作。但存在问题是:反复的...
  • 02_两个赋值指针变量挖字符训练_第3内存模型_传智扫地僧 03_多级指针的野指针问题(释放问题)_传智扫地僧 04_学员作业点评_典型错误吸取教训 05_数组类型 06_数组指针类型和定义数组指针变量的3方法 07_多维...
  • 谭浩强c语言程序设计(第3版)电子书

    千次下载 热门讨论 2010-04-05 21:22:26
     6.7 几种循环的比较 79  6.8 break和continue语句 79  6.8.1 break语句 79  6.8.2 continue 语句 80  6.9 程序举例 81  7 数组  7.1 一维数组的定义和引用 82  7.1.1 一维数组的定义方式 82  7.1.2 一维...
  • 新增支持有关 DataWindow 与结构体、变量之间的赋值、获得数据等 操作的 PB 脚本自动生成。在字段特别多的情况下,比较实用。 PBHelper >>>>>>>>>> 0.8 软件名字从 PBCOMMENT 改名为 PBHelper 支持PB 10.5 beta ...
  • 6.7 几种循环的比较 79 6.8 break和continue语句 79 6.8.1 break语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 7.1.1 一维数组的定义方式 82 7.1.2 一维数组元素的引用 83 ...
  • 6.7 几种循环的比较 79 6.8 break和continue语句 79 6.8.1 break语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组的定义和引用 82 7.1.1 一维数组的定义方式 82 7.1.2 一维数组元素的引用 83 ...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

结构体赋值几种方式