2018-09-30

结构体中成员变量地址是连续的,结构体用于描述记录。

Create a struct

//----------------------------
//struct1.c
//创建一个结构体,给结构体成员赋值,并输出一个成员值。
//----------------------------
#include <stdio.h>
struct teacher
{
/*
no、name、sex是成员
*/
int no;
char *name;//将存储字符串的变量声明为指针的形式,下面会谈到。
char *sex;
};//使用中括号括起成员列表,后面加上分号
/*
上面是结构体声明,也可以放在main函数里面。
struct是结构体关键字,teacher是结构体名,struct teacher是结构体类型。
*/ int main(int argc, char const *argv[])
{
struct teacher tech1;//定义一个结构体变量tech1,再次说明,teacher是结构体名。另外,丢掉struct也是可以的。
tech1.no=1001;//成员赋值
/*
在声明结构体的时候,将存储字符串的变量声明为指针的形式,就可以在main函数中使用下面这种形式进行字符串变量赋值了。
*/
tech1.name="wangfang";
tech1.sex="女";
//也可以这样:struct teacher tech1 = {1001,"wangfang","女"};不可以分开哟。
struct teacher *p;//定义一个指向结构体的指针变量p
/*
一个指向变量的指针表示的是占内存中起始位置,一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组。
为啥指针变量非要是struct teacher类型。因为通过指针变量存储的地址可以访问此地址以及后续地址所存储的内容,但是如何解析这个内容呢?
  所以要给指针声明类型,那么声明什么样的类型呢?显然,你要解析出什么样的类型就声明什么样的类型,你是要按访问的类型解析,所以指针类型和其所指向的变量类型一致。
*/
p=&tech1;//使用取地址符将结构体变量的地址给指针p
printf(p->sex);
/*
使用p->sex这样的形式访问成员,这里的箭头与指针搭配。也可以用tech1.sex,或者把tech1换成指针也可以,像这样(*p).sex。
*/
return 0;
}

Create a struct pointer

//-------------------------------------
//--- struct2.c
//--- 介绍结构体指针,通过指针访问结构体成员值。
//-------------------------------------
#include <stdio.h>
struct teacher
{
int no;
char name[10];
char sex[10];
}; int main(int argc, char const *argv[])
{
struct teacher tech1;
struct teacher *p;
p=&tech1;
scanf("%d",&(p->no));//p->no通过指针取出了成员变量no;&(p->no)取出了该成员变量的地址
printf("%d",tech1.no); scanf("%s",p->sex);
/*
p->sex通过指针取出了字符数组成员变量sex;而p->sex就是字符数组的首地址。如果成员变量sex是指针,像struct1.c那样,那么scanf("%s",p->sex)是行不通的。
*/ printf("%s",tech1.sex);//也可以用printf(tech1.sex)
return 0;
}

Create a struct array

//-------------------------------------
//--- struct3.c
//--- 介绍结构体数组
//-------------------------------------
#include <stdio.h>
struct teacher
{
int no;
char name[10];
char sex[10];
}tech[3]={
{1001,"wang fang", "女"},
{1002,"zhou yu", "女"},
{1003,"zhang han", "女"}};
int main(int argc, char const *argv[])
{
struct teacher *p;
p=tech;//指针指向结构体数组
printf("%s",p->sex);
return 0;
}
/*
p+1表示数组中第2个元素tech[1]的起始地址
*/

Create an union

//-------------------------------------
//--- struct4.c
//--- 介绍共用体(联合体)
//------------------------------------- #include <stdio.h>
typedef struct
{
int no;
char name[10];
char sex[10];
int job;
union//这是联合体关键字,联合体成员共用一块内存单元,共有首地址,内存单元长度由占用空间最大的成员决定。同一时刻只有一个成员有效。
{
int class;//学生有班级无职称
char prof[20];//教师有职称无班级
//教师和学生只能选择一种属性,故适合用联合体。至于引用,就像这样staf[2].category.class。
}category;
}STAFFER;
//使用typedef对结构体重新定义后,结构体类型为STAFFER int main(int argc, char const *argv[])
{
STAFFER staf[20];
//code//
return 0;
}

C语言语法教程-结构体的更多相关文章

  1. golang | Go语言入门教程——结构体初始化与继承

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分. 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么 ...

  2. Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...

  3. C语言第九讲,结构体

    C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...

  4. 标记化结构初始化语法 在结构体成员前加上小数点 如 “.open .write .close ”C99编译器 .

    今天在看串口驱动(四)的时候 有这样一个结构体初始化 我很不理解 如下: static struct s3c24xx_uart_port s3c24xx_serial_ports[NR_PORTS] ...

  5. GO学习-(13) Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  6. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  7. 4-17疑难点 c语言之【结构体对齐】

    今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...

  8. C 语言实例 - 使用结构体(struct)

    C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...

  9. Verilog缺少一个复合数据类型,如C语言中的结构体

    https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...

随机推荐

  1. 爬虫---Beautiful Soup 爬取图片

    上一篇简单的介绍Beautiful Soup 的基本用法,这一篇写下如何爬取网站上的图片,并保存下来 爬取图片 1.找到一个福利网站:http://www.xiaohuar.com/list-1-1. ...

  2. C++学习03_引用

    基本使用 C++提供了给变量命名的机制,就是引用(Reference).引用是一种复合类型. //语法 数据类型 &name=data 注意,引用在定义时需要添加&,在使用时不能添加& ...

  3. Windows | Ubuntu 18.04安装Visual Studio Code

    Visual  Studio Code是一款很好的开源跨平台代码编辑器,这里使用 tarball 格式文件来安装(免安装), 首先下载 .tar.gz 文件包,点击下载, 可自行在官网下载 将文件包解 ...

  4. Codeforces 1278F: Cards

    题目传送门:CF1278F. 题意简述: 有 \(n\) 个独立随机变量 \(x_i\),每个随机变量都有 \(p = 1/m\) 的概率取 \(1\),有 \((1-p)\) 的概率取 \(0\). ...

  5. 2018年蓝桥杯B组C/C++决赛题目

    自己的博客排版,自我感觉略好一点. 先放上题目. 点击查看2018年蓝桥杯B组C/C++决赛题目题解     1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游, ...

  6. USACO Balanced Lineup

    poj 3264 http://poj.org/problem?id=3264 洛谷 P2880 https://www.luogu.org/problemnew/show/P2880 题目描述 Fo ...

  7. [CODEVS4632][BZOJ4326]运输计划

    题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P ...

  8. 记一次linux下安装redis, 设置redis服务, 及添加环境变量

    一. redis的安装 cd /opt                                                                                # ...

  9. [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索之二

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  10. git diff比较版本差异(生成补丁)

    1.git diff [<options>] <commit> <commit> options 使用--name-only(git diff HEAD cd504 ...