C语言学习笔记--结构体
结构体定义三种方式:
#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语言学习笔记--结构体的更多相关文章
- c语言学习笔记 - 结构体位域
在学习结构体的时候遇到了位域这个概念,位域主要是为了节省内存空间,比如用一个32位,4个字节的int存储一个开关变量时,会造成空间浪费,于是干脆就考虑在这个32划分不同的区域来存储数据,例如划出1位存 ...
- C语言学习之结构体
前言 一直以来,C语言的学习都在入门阶段,只用到数组.函数.循环.选择.位运算这些基本的知识,较少用到指针.预处理.结构体.枚举类型.文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言 ...
- C语言学习1——结构体剖析
一、定义结构体变量的方法 1.1先声明结构体类型在定义变量名 例如: a.声明结构体类型 struct student { int num; char name[20]; char sex; int ...
- go学习笔记-结构体
结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...
- C学习笔记-结构体
结构体的定义和初始化 结构体是简单数据类型的综合 struct man { char name[100]; int age; }; struct man m = { "tom", ...
- C学习笔记-结构体与二进制文件增删改查
使用结构体整理数据,然后利用二进制存储文件,这样存储的文件类似于数据库,可以实现文件的增删改查 定义结构体 struct student { unsigned int ID; char name[20 ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- C语言学习笔记10-结构体、枚举、联合体
C语言学习笔记10-结构体.枚举.联合体 待传
- GO学习-(13) Go语言基础之结构体
Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
随机推荐
- Esxi 5.0下配置LSI SAS RAID卡
公司有几台服务器,安装的是ESXI5.0的虚拟机,原来使用的是普通的台式机,现在新购的专用服务器并安装的LSI 8708 SAS RAID卡(服务器自带的板载RAID卡ESXI不支持),现在要将虚拟机 ...
- sql服务器内部参数使用详情(存储过程)
exec sp_help;返回当前数据库中的所有存储过程.exec sp_help datebase.dbo.table名称 返回当前表中的所有对象.如字段名称等.这个吊exec sp_helpfil ...
- web —— jsp笔记
cookies 的使用 1.首先确保客户机上允许使用cookie,一般在浏览器的 隐私 设置项里可以设置. 2.下面给出具体的例子 a)index.jsp中如果没注册过,让游客注册,如果注册了,拿出贮 ...
- GitHub 的分支创建与合并
一个Git仓库可以维护很多开发分支.现在我们来创建一个新的叫"experimental"的分支: $ git branch experimental 如果你运行下面这条命令: $ ...
- struct--------构造函数对结构体初始化的影响
struct--------构造函数对结构体初始化的影响. 没有构造函数时使用如下: struct ClassBook{ int number; int age; }; int main() { ...
- 如何定制Windows系统右键菜单
今天心血来潮把几个自己常用的工具定制到了系统的右键菜单.包括notepad++,7zip,还有复制文件全路径和文件夹路径.下面简单介绍一下步骤. 1. Windows系统右键菜单对应的注册表位置 Wi ...
- ubuntu下安装svn
Ubuntu下使用SVN SVN作为日常开发中不可缺少的工具,今天终于开始在Ubuntu下使用了. 1.首先需要安装SVN.Ubuntu下的SVN安装十分简单,sudo apt-get install ...
- U盘启动安装CentOS 6.3
无光驱U盘启动安装CentOS 6.3的一些必要条件: 1.主板要支持U盘启动 2.8G的U盘 3.UltraISO软件 http://www.linuxidc.com/Linux/2010-03/2 ...
- python环境准备
一.环境准备. 1.安装python3.5.2(勾选环境变量),python2.7.12 2.设置环境变量 (要求命令行输入python,进入python2命令行,打python3时,进入python ...
- 将JSON数组显示前台Table中
将JSON数组显示前台Table中 在最近的学习中遇到一个小问题,如何把JSON数组显示在前台的table中,经过一番借鉴和学习之后终于解决了这个问题.具体的代码如下: (前提:利用ajax获取过来的 ...