struct初始化
C语言中struct初始化
• 普通结构体的初始化
假设我们有如下的一段代码,其中已有Student结构体,要求实例化一个Student对象并将其初始化。
#include <stdio.h> typedef struct _Student
{
unsigned age;
unsigned grade;
} Student; int main(int argc, char ** argv)
{
// 完成Student s的初始化,age = 16,grade = 1 printf("Age = %u\n", s.age);
printf("Grade = %u\n", s.grade); return ;
}
▶ 实例化后为成员赋值方式
Student s;
s.age = ;
s.grade = ;
▶ 顺序初始化方式
Student s = { , };
▶ 点符号初始化方式
注意在此方式在,成员初始化可以不按照顺序初始化,即可以乱序初始化。
Student s = {
.grade = ,
.age = ,
};
▶ 冒号号初始化方式
注意在此方式在,成员初始化可以不按照顺序初始化,即可以乱序初始化。
Student s = {
grade : ,
age : ,
};
• 含有数组成员结构体的初始化
例如我们将Student结构体中加入char name[32]的字段,并初始化该字段。我们知道数组的初始化可以使用花括号进行所有元素或部分元素的初始化,譬如:
int a[] = { , , , , , , , , , };
int b[] = { , , };
那么含有数组成员的结构体初始化也可以使用这个规则。新的Student按照上述四种方式的初始化方式如下:
// 实例化后为成员赋值方式
Student s;
s.age = ;
s.grade = ;
strcpy(s.name, "Jack"); // 顺序初始化方式
Student s = { 16, 1, "Jack" };
Student s = { 16, 1, {'J', 'a', 'c', 'k', '\0'} }; // 点符号初始化方式
Student s = {
.name = "Jack",
.grade = 1,
.age = 16,
}; Student s = {
.name = {'J', 'a', 'c', 'k', '\0'},
.grade = 1,
.age = 16,
}; // 冒号号初始化方式
Student s = {
name : "Jack",
grade : 1,
age : 16,
}; Student s = {
name : {'J', 'a', 'c', 'k', '\0'},
grade : 1,
age : 16,
};
• 复杂结构体的初始化
复杂结构体无非是结构体中嵌套结构体,我们只需要结合上述规则就可以完成复杂结构体的初始化。例如我们将Student的结构体修改成这样:
typedef struct _StudentInfo
{
unsigned age;
char name[];
} StudentInfo; typedef struct _Student
{
unsigned classes;
unsigned grade;
StudentInfo info;
} Student;
那么综合运用上述规则,初始化代码可以写成如下风格:
Student s = {
.info = {
name : "Jack",
.age =
},
.grade = ,
classes :
};
C++语言中struct初始化
• 普通结构体的初始化
假设我们有如下的一段代码,其中已有Student结构体,要求实例化一个Student对象并将其初始化。
#include <string>
#include <iostream>
using namespace std; typedef struct _Student
{
unsigned age;
unsigned grade;
string name;
} Student; int main(int argc, char ** argv)
{
// 完成Student s的初始化,age = 16,grade = 1,name = “Jack” cout << "Age : " << s.age << endl;
cout << "Grade : " << s.grade << endl;
cout << "Name : " << s.name << endl; return ;
}
▶ 实例化后为成员赋值方式
Student s;
s.age = ;
s.grade = ;
s.name = "Jack";
▶ 顺序初始化方式
Student s = { , , "Jack" };
▶ 点符号初始化方式
注意在此方式在,和C风格不同,成员初始化不可以乱序初始化,否则编辑器将给出错误:“对不起,尚未实现:不平凡的代理初始值设定不受支持”。
Student s = {
.age = ,
.grade = ,
.name = "Jack",
};
▶ 冒号号初始化方式
注意在此方式在,和C风格不同,成员初始化不可以乱序初始化,否则编辑器将给出错误:“对不起,尚未实现:不平凡的代理初始值设定不受支持”。
Student s = {
age : ,
grade : ,
name : "Jack",
};
• 含有数组成员结构体的初始化
例如我们将Student结构体name字段的类型从string改为char [32],并初始化该字段。我们可以发现在C++中char数组严格视为数组,不能直接进行字符串赋值操作。如果我们将代码写成如下方式,编译器将给出错误:“错误:C99 designator ‘name’ outside aggregate initializer”。
Student s = {
age : ,
grade : ,
name : "Jack",
};
正确的赋值方式就是严格按照数组初始化方式进行赋值:
Student s = {
age : ,
grade : ,
name : {'J', 'a', 'c', 'k', '\0'},
};
需要说明一点的是,点符号和冒号的赋值方式可以混用,这个在上面C语言风格结构体初始化中可以看到运用,这一点在C++中也是适用的,譬如上面的代码可以写成:
Student s = {
.age = ,
grade : ,
.name = {'J', 'a', 'c', 'k', '\0'},
};
• 复杂结构体的初始化
复杂结构体无非是结构体中嵌套结构体,我们只需要结合上述规则就可以完成复杂结构体的初始化。例如我们将Student的结构体修改成这样:
typedef struct _StudentInfo
{
unsigned age;
char name[32];
} StudentInfo; typedef struct _Student
{
unsigned classes;
unsigned grade;
StudentInfo info;
} Student;
那么综合运用上述规则,初始化代码可以写成如下风格:
Student s = {
.classes = ,
grade : ,
.info = {
age : ,
.name = { 'J', 'a', 'c', 'k' }
}
};
一些使用建议
• 无论采用哪种方式初始化结构体,请按照成员出现的顺序进行初始化。
• 初始化方式尽量采用同种风格,即点符号风格和冒号风格不要混用。
• 点符号方式是C99标准,冒号方式是GCC的扩展,强烈建议使用点符号方式。
• 字符数组初始化请严格按照数组初始化规则进行初始化。
Aggregate Initialization
http://en.cppreference.com/w/cpp/language/aggregate_initialization
https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
struct初始化的更多相关文章
- C++ struct 初始化的问题
struct student { int age; string name; int id; }; 初始化: student st1={10, "li ming", 01}; 修改 ...
- 内置函数new() 和struct{} 初始化的区别
一.new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针.在golang的代码定义如下: func new(t Type ...
- golang struct 转map 及 map[string]*Struct 初始化和遍历
package main import ( "encoding/json" "errors" "fmt" "reflect&quo ...
- c++由string组成的struct初始化崩溃
struct _UserInfo { string username; string password; string ip; string port; } _UserInfo str={}; 这样就 ...
- 结构及其使用 struct (C#)
首先结构是值类型. 结构是使用 struct 关键字定义的,结构如下: struct 结构名{} 结构概述 结构具有以下特点: 结构是值类型,而类是引用类型. (结构不能包含显式的无参数构造函数) 与 ...
- C基础--结构体成员初始化方式
之前在linux内核代码中看到结构体成员成员初始化使用类似于.owner = THIS_MODULE, 不太见过,于是搜了个博客,分享下: 转自:http://www.cnblogs.com/Anke ...
- Go基础系列:struct和嵌套struct
struct struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一. 说白了就是拿来存储数据的,只不过可自定义化的程度很高,用 ...
- Linux下C结构体初始化[总结]
1.前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t { int a; int b; }d ...
- Linux下C结构体初始化
1.前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t { int a; int b; }d ...
随机推荐
- Fiddler是最强大最好用的Web调试工具之一--网站抓包分析
Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发 ...
- [css]解决iframe在ios设备上无法滚动
原因: safari的webkit内核特性 解决方案: 在iframe外包裹一层div并另外设置其css属性为如下: -webkit-overflow-scrolling:touch; overflo ...
- MathType中如何快速输入空心字母
MathType输入数学公式时非常方便有效的,在文档中涉及到数学公式或者符号时都是使用MathType来进行的,因为它比Office自带的公式编辑器功能更为完善,使用起来更快捷.在数学公式中,在不同的 ...
- 编程之美 set 7 求数组中的最长递增子序列
解法 1. 假设在目标数组 array[] 的前 i 个元素中, 最长递增子序列的长度为 LIS[i] 那么状态转移方程为 LIS[i] = max(1, LIS[k]+1) array[i+1] & ...
- jedispool 连 redis
java端在使用jedispool 连接redis的时候,在高并发的时候经常卡死,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用je ...
- js修改剪切板内容的方法
代码如下: //绑定在了body上,也可以绑定在其他可用元素行,但是不是所有元素都支持copy事件. $(document.body).bind({ copy: function(e) {//copy ...
- Spring JDBC样例
这里介绍一下通过Spring JDBC的方式进行数据库的增删改查的操作.在进行程序的编写之前我们需要在本地MySQL数据库中创建一张User表,如下所示: create database user_d ...
- Android之背景颜色小知识(笔记)
一.ListView的item背景(自定义颜色) 通常情况下,ListView的item背景用的是图片资源,下面跟大家分享一下使用颜色资源,即自定义一种颜色,当item聚焦.按压.选择的时候,可以显示 ...
- 打包签名时出现Conversion to Dalvik format failed with error 1
今天在导出签名APK时,居然出现了“Conversion to Dalvik format failed with error 1” 于是,我习惯性地“Project”->“Clean”,把工程 ...
- js 中导出excel 较长数字串会变成科学计数法(转载)
在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串转换成 科学计数法.现在网上找到解决方案之一: (在数字串 ...