数据类型分为4种, 简单数据类型,构造数据类型,指针数据类型,空类型。

结构体属于构造数据类型,用struct标识。

声明一个结构体:

Typedef  struct和struct

c

c++

typedef struct tMyStruct

{

int iNum;

long lLength;

} ST_MYSTRUCT;

在C中,这个申明后申请结构变量的方法有两种:

(1)struct tMyStruct 变量名;;

(2)ST_MYSTRUCT变量名

在c++中可以有

(1)struct tMyStruct 变量名;

(2)ST_MYSTRUCT变量名;

(3)tMyStruct 变量名;

typedef struct

{

int a;

}ST_MYSTRUCT;

在声明变量的时候就可:

ST_MYSTRUCT  st1;

typedef struct

{

int a;

}ST_MYSTRUCT,ST_MYSTRUCT_PTR;

定义了结构体类型ST_MYSTRUCT;

以及结构体指针类型ST_MYSTRUCT_PTR;

typedef struct

{

int num;

int age;

}ST_AAA,ST_BBB,ST_CCC;

ST_AAA,ST_BBB,ST_CCC三者都是同一结构体类型。声明变量时用任何一个都可以,在c++中也是如此

同左。

struct Student {

int a ;

}stu1;

声明了结构体类型struct Student ,

同时也声明了结构体变量stu1。

struct {

int a ;

}stu1;

声明了结构体变量stu1

  • 结构体赋值:

struct st1 {
int a;
int b;
}; 1 对成员赋值.
1.1 用{}形式.
struct st1 st1 = {1,2,3); //定义并初始化结构体变量
1.2 linux kernel风格.
struct st1 st1 = { //定义并初始化结构体变量
.a = 1;
.b = 2;
}; 2 对整体赋值.
struct st1 a, b; //声明结构体变量
b = a; //结构体直接赋值 3 结构体作为函数返回值对另一个结构体赋值.
struct st1 func1(); struct st1 a = func1();

  

  • 结构体直接赋值的不安全因素:(c语言)

struct A{
  char v1[20];
  int v2;
} a,b;

a = b;
这没有任何问题.

但是:
struct B{
  char *v1;
  int v2;
} c,d;
c = d;
这种结构体赋值,就需要注意(包括在C++里)。
对于指针赋值,即不是数据进行了复制保存而是多了一个指针指向而已,这样一旦b对象释放,a的指向就成了非法的垃圾数据。

所以在c中,自定义类型、数组都是要另外自己定义复制函数的,这主要是代码安全考虑,而不是语言层面考虑。

  • 结构体定义,声明,赋值:

#include <stdio.h>
//也可以这样:
typedef struct st1 {
int e1;
int e2;
}ST_MY; //1.定义结构体类型的时候,里面是分号,定义完毕后要加分号。 ST_MY func1()
{
ST_MY h = { 77, 88};
return h;
} int main()
{
ST_MY a = { 33, 44}; // 2.定义并初始化一个结构体
ST_MY b = {
.e1 = 55, //3.0 定义并初始化一个结构体时,可以点赋值
}; //3.1 点赋值只能是初始化结构体变量时才能用
ST_MY c;
ST_MY d, e; c = a;//4.结构体直接赋值(方法1)
d = func1();//5.结构体直接赋值(方法2)
e.e2=77; //6.声明之后为一个结构体变量赋值效果.不同于定义并初始化一个结构体变量。 printf("a.e1 a.e2 is %d %d\n", a.e1, a.e2);
printf("b.e1 b.e2 is %d %d\n", b.e1, b.e2);
printf("c.e1 c.e2 is %d %d\n", c.e1, c.e2);
printf("d.e1 d.e2 is %d %d\n", d.e1, d.e2);
printf("e.e1 e.e2 is %d %d\n", e.e1, e.e2); f1(); return 0;
}
/*
root@oucaijun:/work/dcc# gcc *.c; ./a.out
a.e1 a.e2 is 33 44
b.e1 b.e2 is 55 0
c.e1 c.e2 is 33 44
d.e1 d.e2 is 77 88
e.e1 e.e2 is -1074143256 77 //6.声明之后为一个结构体变量赋值效果.不同于定义并初始化一个结构体变量。
*/

  

  • 结构体与数组比较

结构体是一等公民;

数组是二等公民

从词条上解释可以看出二等公民与一等公民在权利上是有差别的,这个词很有意思作为计算机专业术语,其含义也有异曲同工之妙!同样我们看看维基百科对计算机的术语”first-class citizen"(一等公民)的定义,一般要满足以下几点,

      • can be stored in variables and data structures
      • can be passed as a parameter to a subroutine
      • can be returned as the result of a subroutine
      • can be constructed at run-time
      • has intrinsic identity (independent of any given name)

对比着上面的定义来看C语言数组,

数组作为一个函数的参数传递时,退化成一个指针;

同时,数组无法作为函数的返回值;

也许让数组更不服气的是,数组之间不能直接赋值操作,

如下面的操作就是非法的:

int a[10];
int b[10];
a = b;

但是如果数组包装在结构体中,那么就能进行赋值了!

相比之下,结构体可以作为函数参数和返回值,这就是一等公民的待遇!

至于为什么数组必须是二等公民,这是有历史原因的,大家可以参考C 语言的发展史来看,有时间这块内容我再补上!

源文档 <http://www.cnblogs.com/hazir/p/C_struct_assignment.html>

c语言,结构体的更多相关文章

  1. 漫谈C语言结构体struct、公用体union空间占用

    先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...

  2. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  3. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  4. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  5. C语言结构体定义的几种方法

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  6. 对嵌入式开发C语言结构体的一点总结

    今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...

  7. C语言结构体变量私有化

    操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 ...

  8. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  9. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  10. Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

随机推荐

  1. js 完成单继承

    //1.使用prototype完成单继承. //定义一个A类 function A(){ } //为A类动态调用属性color,与方法sayColor A.prototype.color = &quo ...

  2. foreach遍历对象的属性

    <?php class MyClass { public $var1 = 'value 1' ; public $var2 = 'value 2' ; public $var3 = 'value ...

  3. codeforces 464C. Substitutes in Number

    题目链接 C. Substitutes in Number time limit per test 1 second memory limit per test 256 megabytes input ...

  4. poj 2965

    http://poj.org/problem?id=2965 本题要结合poj 1753 来看最好...又有了一点搜索的经验..加油... #include <iostream> #inc ...

  5. Introduction to Json

    什么是Json 是Javascript·对象的一种表示,属于轻量级数据,它比XMl小,快,易解析 作用: 用于存储和交换(转换)信息的语言,还可以将各种数据类型放在json中并进行数据传输 整理的章节 ...

  6. Embedded Linux Primer----嵌入式Linux基础教程--2.4节--嵌入式Linux发行版

    嵌入式Linux发行版 究竟什么是Linux发行版?在Linux内核引导之后,它期望找到并挂载根文件系统.当一个匹配的根文件系统已经挂载上,启动脚本开始运行大量程序和系统要求的工具.这些程序经常调用其 ...

  7. redis缓存工具Jedis进行跨jvm加锁(分布式应用)--不幸暂弃用--能够做第三方锁使用

    近期使用redis碰到了多个并发处理同一个缓存的情况.在这样的情况下须要进行加锁机制. 本来想使用java自带的ReadWriteLock进行设置读写锁,这也是上家公司使用的方法. 后来经过商讨,给予 ...

  8. 针对苹果最新审核要求 为应用兼容IPv6

    本文授权转载,作者:我不是段誉(简书) 在WWDC2 015上苹果宣布iOS 9将支持纯IPv6的网络服务.2016年初开始所有提交到App Store的应用必须支持IPv6.而今年5月初,苹果宣布6 ...

  9. ZOJ 3204 Connect them MST-Kruscal

    这道题目麻烦在输出的时候需要按照字典序输出,不过写了 Compare 函数还是比较简单的 因为是裸的 Kruscal ,所以就直接上代码了- Source Code : //#pragma comme ...

  10. django学习之Model(三)QuerySet

    接下来主要学习Models中的Making queries 写好models.py后,django会自动提供一个数据库的抽象API,来实现CRUD(create, retrieve, update, ...