结构体定义三种方式:

       #include<stdio.h>
//第一种定义方法
struct point {
int x;
int y;
};
struct point p1,p2; //第二种定义方法
struct {
int x;
int y;
} p1,p2; //第三种定义方法
struct {
int x;
int y;
} p1,p2;

这三种方法,对于第一和第三种,都声明了结构point。但是第二种没有,只声明了两个变量。

下面的小例子,说明结构类型的两种初始化方法。

       #include<stdio.h>
struct date {
int month;
int day;
int year;
};
int main()
{
struct date today = {,,};    //结构的初始化,方法1;同数组初始化。
struct date thismonth = {.month = ,.year = };    //结构的初始化,方法2;指定对应的结构成员初始化。
printf("Todays date is %i-%i-%i\n",today.day,today.month,today.year)
printf("This month date is %i-%i-%i\n",thismonth.month = ,thismonth.year = }
return ;
};

结构成员:

  结构和数组有点像,访问方法不同。数组是【】访问里面的元素;结构是用.来访问结构成员。

结构运算:

  要访问整个结构,可以直接访问结构变量的名字。

  对于整个结构可以赋值,取地址,可以传递给函数。

  p1 = struct point{5,10};  //相当于p1.x = 5,p1.y = 10

  p1  = p2;

结构指针:

  结构和数组不一样,数组是指针,可以直接取地址。对结构成员取地址,必须用&。

  struct date *pdate = &today;

结构作为参数函数:

  int numofdays(struct date d);

  整个结构可以作为参数的值传入函数。

  这个时候是在函数内部新建一个结构变量,并且赋值调用者结构的值。

  也可以返回一个结构。和数组不同。  

       #include<stdio.h>
#include<stdbool.h> struct date {
int month;
int day;
int year;
}; bool isLeap(struct date d);
int numberOfDays(struct date d); int main(int argc,char const *argv[])
{
struct date today,tomorrow; printf("Enter today's date (mm dd yyyy):\n");
scanf("%i %i %i",&today.month,&today.day,&today.year); if ( today.day != numberOfDays(today)) {
tomorrow.day = today.day + ;
tomorrow.month = today.month;
tomorrow.year = today.year;
} else if ( today.month == ){
tomorrow.day = ;
tomorrow.month = ;
tomorrow.year = today.year + ;
} else {
tomorrow.day = ;
tomorrow.month =today.month + ;
tomorrow.year = today.year;
}
printf("tomorrow's date is %i-%i-%i\n",tomorrow.day,tomorrow.month,tomorrow.year);
return ;
} int numberOfDays(struct date d)
{
int days;
const int daysPerMonth[] = {,,,,,,,,,,,};
if ( d.month == && isLeap(d))
days = ;
else
days = daysPerMonth[d.month - ];
return days;
} bool isLeap(struct date d)
{
bool leap = false;
if ( (d.year % == && d.year% != ) || d.year% == )
leap = true;
return leap;

输入结构:

  scanf函数只能读入一个变量。怎么读入一个结构呢?

  可以调用一个函数来实现。注意:C语言的函数调用是传值的。

  所以在函数中的结构变量p和main函数中的结构变量p是不同的。

       #include<stdio.h>

       struct point {
int x;
int y;
}; void getStruct(struct point p);
void putStruct(struct point p); int main(int grvc,const char *agrv[])
{
struct point y ={,};
// y = {0,0}; ---->结构体的初始化只能用上面的方法,这种写法无法编译
getStruct(y);
putStruct(y); return ;
} void getStruct(struct point p)
{
// struct point p; ---->此处重复定义结构体。因为结构体在函数头已经定义。
scanf("%d",&p.x);
scanf("%d",&p.y);
printf("您输入的结构体是%d %d\n",p.x,p.y);
}
void putStruct(struct point p)
{
printf("%d %d\n",p.x,p.y);
}
运行结果: 输入 3 4 输出 3 4 // 0 0

  在函数读入p之后没有任何值返回给main,所以主函数结构值不变。

解决方案:

  在函数内部创建一个临时的结构变量p,返回一个结构变量。

       #include<stdio.h>

       struct point {
int x;
int y;
}; struct point getStruct(void);
void putStruct(struct point p); int main(int grvc,const char *agrv[])
{
struct point y ={,};
y = getStruct();
putStruct(y); return ;
} struct point getStruct(void)
{
struct point p = {,};
scanf("%d",&p.x);
scanf("%d",&p.y);
printf("您输入的结构体是%d %d\n",p.x,p.y); return p;
}
void putStruct(struct point p)
{
printf("%d %d\n",p.x,p.y);
}
运行结果: 输入3 4 输出 3 4// 3 4

指向结构的指针:  

       #include<stdio.h>
struct date {
int month;
int day;
int year;
} myday; struct date *p = &myday (*p).month = ;
p->month = ;

用->表示指针所指结构变量中成员。 

       #include<stdio.h>

       struct point {
int x;
int y;
}; struct point* getStruct(struct point *p);
void putStruct(struct point p); int main(int grvc,const char *agrv[])
{
struct point y ={,};
getStruct(&y);
putStruct(y);
putStruct(*getStruct(&y)); return ;
} struct point* getStruct(struct point *p)
{
scanf("%d",&p->x);
scanf("%d",&p->y);
printf("您输入的结构体是%d %d\n",p->x,p->y); return p;
}
void putStruct(struct point p)
{
printf("%d %d\n",p.x,p.y);
}

  

C语言学习笔记--结构体的更多相关文章

  1. c语言学习笔记 - 结构体位域

    在学习结构体的时候遇到了位域这个概念,位域主要是为了节省内存空间,比如用一个32位,4个字节的int存储一个开关变量时,会造成空间浪费,于是干脆就考虑在这个32划分不同的区域来存储数据,例如划出1位存 ...

  2. C语言学习之结构体

    前言 一直以来,C语言的学习都在入门阶段,只用到数组.函数.循环.选择.位运算这些基本的知识,较少用到指针.预处理.结构体.枚举类型.文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言 ...

  3. C语言学习1——结构体剖析

    一、定义结构体变量的方法 1.1先声明结构体类型在定义变量名 例如: a.声明结构体类型 struct student { int num; char name[20]; char sex; int ...

  4. go学习笔记-结构体

    结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...

  5. C学习笔记-结构体

    结构体的定义和初始化 结构体是简单数据类型的综合 struct man { char name[100]; int age; }; struct man m = { "tom", ...

  6. C学习笔记-结构体与二进制文件增删改查

    使用结构体整理数据,然后利用二进制存储文件,这样存储的文件类似于数据库,可以实现文件的增删改查 定义结构体 struct student { unsigned int ID; char name[20 ...

  7. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  8. C语言学习笔记10-结构体、枚举、联合体

    C语言学习笔记10-结构体.枚举.联合体    待传

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

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

随机推荐

  1. 423. Reconstruct Original Digits from English

    这个题做得突出一个蠢字.. 思路就是看unique letter,因为题里说肯定是valid string.. 一开始有几个Z就有几个ZERO 同样的还有x for six, g for eight, ...

  2. Python进程、线程、协程详解

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  3. ISAP 简介

    刘汝佳的蓝书上已经给出了大部分,先给上完整代码(以草地排水为例). #include<iostream> #include<algorithm> #include<cst ...

  4. 博客SEO-搜索引擎工作原理简介

    资源推荐 Zac出版的<SEO实战密码>是SEO入门的好书,可惜我在当当网买的电子书受DRM版权保护,无法与大家分享. 我在网上找到了此书的  了解搜索引擎  章节,非常详细,且容易理解. ...

  5. Unity3D 画线插件 Vectrosity_Simple2DLine

    Vectrosity是一个很方便的画线插件,用它我们可以画出2D,3D,贝塞尔,圆,椭圆等各种线条图案. :链接: http://pan.baidu.com/s/1pJjTFjt 密码: uesn 首 ...

  6. 一行代码实现iOS序列化与反序列化

    一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...

  7. 2015 UESTC Training for Search Algorithm & String - M - Palindromic String【Manacher回文串】

    O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度 ...

  8. NYOJ 47过河问题

    主要思路:先排序.有两种可能是最小的情况,一种是让最小的去带着最大的过去,然后最小的再回来,还有一种就是先最小的和第二小的一块过去, 然后最小的回来,让最大的和第二大的过去,接着第二小的回来,第二小和 ...

  9. 请输出in.txt文件中的2 4 6 8 9 10 12行

    in.txt文件: 学号 姓名 性别 年龄 1001 张三 男 18 1002 赵四 男 19 1003 李丽 女 18 1004 刘芳 女 32 1005 王五 男 54 1006 小明 男 32 ...

  10. entity 实体模型timeout设置

    public Entities(): base("name=Entities") { var adapter = (IObjectContextAdapter)this; var ...