定义结构:

  在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int、double、float、char等这些基础类型,还有指针、数组等。如果你要表达的数据比较复杂,不是一个值,比如你要表达日期,有年月日三个值,要表达时间,有时分秒三个值,要表达一个人可能需要姓名、学号等一堆数据,但是又想要一个整体表达这么多数据,这时就需要C语言中一种特殊的东西,叫做结构!

  一个结构就是一个复合的数据类型,里面有各种数据类型的成员,然后用一个变量来表达那么多的数据。比如下面的这个程序,首先声明了一个结构类型date,其中struct是关键字,它的成员放在大括号中,每个结构date中有三个成员,一个是int类型的month、int类型的day、int类型的year,将来使用date定义的变量都会由三个成员,在声明date的时候就是使用一条C语言的语句,那么比较容易忘掉的事情是大括号后面也有分号。

 #include <stdio.h>
int main(int argc,char const *argv[]){
struct date{ //声明结构类型,这个结构类型叫做date
int month;
int day;
int year;
}; struct date today;
today.month = ;
today.day =;
today.year=; printf("Today's date is %i-%i-%i.\n'",today.year,today.month,today.day); return ;
}

  上述程序是在main内部声明的struct date,那么date和本地变量一样,在函数内部声明的结构类型只能在函数内部使用,如果你希望你的结构能够被更多的地方去使用,能够被main外的其他函数也可以使用这种结构体类型的话,所以通常在函数外部声明结构类型,让这个结构体和函数处于同等地位,它不依附于任何的函数,是可以被所有的函数所使用了,只要在这个结构声明的下面,都可以使用这个结构类型来做事情。

  声明一个结构后,使用时可以像上述程序那样,使用struct date定义一个变量today,today有三个成员。再比如:

定义:
struct point{
int x;
int y;
}; 使用:
struct point p1,p2;//p1和p2都是point里面有x和y的值

  除了这种定义和使用形式外,还可以如下定义,只有关键字struct、大括号,但是没有名字了,其中p1和p2不是类型的名字,而是其前面这种结构的两个变量,但是这个结构叫什么名字哪?没有名字:

struct {
int x;
int y;
}p1,p2; p1、p2都是一种无名结构,里面有x和y

  在c语言中有这种定义方式,只是想要定义两个变量,每个变脸包括两个成员,但是并没有想长远使用这种类型,所以在结构后直接写p1和p2,这种定义形式不太常见,更常见的如下形式,声明了一个新的结构类型point,在大括号后定义了p1和p2两个变量,所以这一句做了两件事情,第一件事情是声明了一个结构叫做point,定义了这种结构的两个变量p1和p2:

struct point{
int x;
int y;
}p1,p2; p1和p2都是point里面有x和y的值

定义结构变量:

  struct date today;是定义了一个结构为date的变量,变量名是today,因为date有三个成员,那么today也有month、day和year三个整型数据组成的,实际上在定义today后,编译器就会在内存中分配三个整型空间给today。定义结构和定义结构变量是两件不同的事情,定义结构是定义一种新的结构类型,定义结构变量则是定义该结构的一个变量,可以使用该结构定义很多个结构变量出来,每个结构变量都按照结构定义的样子有多个成员:

定义结构,结构名是date:
struct date{
int month;
int day;
int year;
}; 定义结构变量,变量名是today:
struct date today;

结构变量的初始化:

  既然是一个变量,就需要考虑变量的初始化,放在函数内部的变量是本地变量,本地变量是没有默认的初始值的,如果你没有给它一个初始值,那么默认里面就会是乱七八糟的值,所以怎么给一个结构变量一个初始值呢?如果是一个int变量,赋初值就是让该变量等于一个数,如果是一个数组,那么给数组赋初值需要大括号,大括号里的值依次赋给数组里的每一个单元,现在对结构变量还是需要大括号来赋初值,写法如下,struct date today = {07,31,2014}写成这样,编译器会知道07是给第一个成员month,31是给第二个成员day,2014是给第三个成员year,这种初始化的方式和数组很类似:

 #include <stdio.h>

 struct date{
int month;
int day;
int year;
}; int main(int argc,char const *argv[]){ struct date today = {,,};
printf("Today's date is %i-%i-%i.\n'",today.year,today.month,today.day); return ;
}

结构成员:

  在定义结构类型的时候,在结构类型里给出一些成员,称为成员变量。结构和数组有点像,数组有很多个单元,结构里有很多个成员,不一样的是数组的单元必须是相同类型,而结构里的成员可以是不同类型,数组可以用[]运算符和下标访问其成员,比如a[0]=10,而结构是使用小圆点.运算符和成员名字来访问其成员,比如:

today.day:  访问today变量的成员day
p1.x; 访问结构变量p1的成员x

  需要注意的是,结构类型有结构变量,结构类型是虚的,不是实体,定义一个结构类型只是告诉编译器说,说有这种结构类型的变量将来都长成这个样子,但是结构类型没有东西,所以结构类型.xxx是没有意义的,在点.运算符左边的一定是一个结构变量,结构变量才是实体。

结构运算:

  对于数组可以取下标运算,整个数组是一个指针等。对于结构来说,可以通过.运算来访问某个成员,也可以拿结构整体来做一个运算,这个时候结构表现出来的特性和数组完全不一样,可以使用结构变量的名字访问整个结构,对于整个结构来说也可以做赋值、取地址,也可以传递给函数参数,而且这种赋值是数组不能做的。

p1=(struct point){,};  //相当于p1.x=5;p2.y=10;
p1=p2; //相当于p1.x=p2.x;p1.y=p2.y;
 #include <stdio.h>

 struct date{
int month;
int day;
int year;
}; int main(int argc,char const *argv[]){ struct date today ;
today =(struct date) {,,};
struct date day;
day=today; printf("Today's date is %i-%i-%i.\n'",today.year,today.month,today.day);
printf("The day's date is %i-%i-%i.\n'",day.year,day.month,day.day); return ;
}

  修改文初时的程序,给结构变量today使用类型转换赋初值,然后定义结构变量day,并将today整个赋给day,day得到了today所有成员变量的值,但是day和today是两个独立的结构变量。

结构指针:

  和数组是非常不一样的是,结构变量的名字并不是结构变量的地址,必须使用&运算符,而数组的名字就是数组的地址,对数组取不取地址都是一样的,值都是数组的首地址。来试一下:

 #include <stdio.h>

 struct date{
int month;
int day;
int year;
}; int main(int argc,char const *argv[]){ struct date today ;
today =(struct date) {,,}; struct date *pDate = &today; //指向结构的指针pDate printf("Today's date is %i-%i-%i.\n'",today.year,today.month,today.day);
printf("address of today is %p\n",pDate); return ;
}

  struct date *pDate = &today; 中,pDate是指向结构的指针,指向today,但是如果把today前面的&去掉,编译就会报错,所以结构和指针是很不一样的。

听翁恺老师mooc笔记(10)--结构的更多相关文章

  1. 听翁恺老师mooc笔记(12)--结构中的结构

    结构数组: 和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组.比如下面这个例子: struct date dates[100] ...

  2. 听翁恺老师mooc笔记(11)--结构和函数

    结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...

  3. 听翁恺老师mooc笔记(13)--类型定义和联合

    typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...

  4. 听翁恺老师mooc笔记(16)--程序设计与C语言

    问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...

  5. 听翁恺老师mooc笔记(15)--文件的输入与输出

    <>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...

  6. 听翁恺老师mooc笔记(14)--格式化的输入与输出

    关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...

  7. 听翁恺老师mooc笔记(8)--字符串2

    字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...

  8. 听翁恺老师mooc笔记(7)--字符串1

    C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...

  9. 听翁恺老师mooc笔记(6)--指针运算

    指针值加1就是将指针值加上sizeof(指针所指变量的类型) 1+1=2,那么指针加1是加上了1这个数字吗?试一下,在代码中定义了char数组,char也是整数,数组名是ac,ac中有10个元素,0- ...

随机推荐

  1. JavaScript小括号、中括号、大括号的多义性

    语义1,函数声明时参数表 func(arg1,arg2){ // ... } 语义2,和一些语句联合使用以达到某些限定作用 // 和for in一起使用 for(var a in obj){ // . ...

  2. AJAX实现简单的读取文本文档内容到网页--AJAX

    效果图: Demo.html: <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  3. C#接口--C#基础

    1.接口的声明 接口:描述属于任何类或者结构的一组相关功能,是一种规范.功能 组成:属性.方法.事件.索引或者这四种成员的任意组合构成 基本知识点: 1)接口默认的权限修饰符是:public,不允许加 ...

  4. jquery中的事件与应用

    mouseover和mouseenter的区别 mouseenter的定义是当鼠标穿过该元素才会被执行,而mouseover是当鼠标穿过该元素或者其子元素皆会触发该事件 mouseleave一般是与m ...

  5. 【NOIP2014】【洛谷1941】【CJOJ1672】飞扬的小鸟

    题面 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话, ...

  6. 使用JSONP实现跨域

    什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通 ...

  7. angular2 实现的小项目

    之前根据官网的demo做了一个小例子,将的都比较基本,为了更好的提高对angular的认知,又做了一个小例子,目前还不完善.主要有路由,http,组件之间的通信,服务等基本知识. 项目地址:https ...

  8. 网页提示错误(net::ERR_EMPTY_RESPONSE)

    突然个别网页打不开,报上面的错,本来还以为是网页的问题,结果发现是自己的电脑的问题..因为从别的设备上可以打开相同网页. 1.运行→regedit→进入注册表, 在 HKEY_LOCAL_MACHIN ...

  9. java——对象学习笔记

    1.面向对象(OOP)的三大特性 对象的行为(behavior):可以对对象施加哪些操作,或者可以对对象施加哪些方法. 对象的状态(state):当施加那些方法后,对象如何响应. 对象标识(ident ...

  10. NodeJS 远程连接windows 上的MongoDB

    ---恢复内容开始--- 在购买了腾讯云主机,部署了nodejs项目之后,发现没有mongo数据库,于是在官网上下载了最新版的mongo数据库.然后就有了下边的一系列问题. 1.先说说基础配置吧. 1 ...