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语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
随机推荐
- 安卓在SQLiteOpenHelper类进行版本升级和降级
一.升级(使用到onUpgrade()方法和onCreate()没有安装过才用到) 简单理一下思路: v1.0 (也就是说第一次使用这软件,没有安装过 所有在onCreate() 方法里写代码) ...
- python urllib2详解及实例
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件.他以urlopen函数的形式提供了一个非常简单的接口, 这是具有利用不同协议获取URLs的能 ...
- C#中操作WMI的类库-实现远程登录共享
WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通过WM ...
- Android 网络技术HTTP
1.XML3种解析方式(DOM.SAX.PULL) 在网络上传输数据时最常用的格式有两种,XML 和JSON 这里首先明白什么是SAX是一个用于处理XML事件驱动的"推"模型,优点 ...
- 如何调试delphi的Access violation at address错误
1.什么是 MAP 文件?简单地讲,MAP 文件是程序的全局符号.源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方.任何时候使用,不需要有额外的程序进行支持. 2.DELPHI下生成MAP文 ...
- EventLoop的设计
1. Event Loop作为一个IO线程,通过IO复用来处理事件 2. 为了保证线程安全,任何需要修改IO线程资源的工作都交给IO线程亲自来做 3. 为了IO线程与其他线程互调,需要设计一个even ...
- ios创建的sqlite数据库文件如何从ios模拟器中导出
为了验证数据库的结构,有的时候需要使用一些管理工具来直接查看sqlite数据库的内容,在windows下有sqlite3的专用工具下载,而在ios下也可以使用火狐浏览器的插件sqlitemanager ...
- JS HTML 单引号与双引号
JS中,单引号和双引号其实没啥区别,看你自己习惯了. 但若双引号中再使用双引号,我们可采取"外双内单"或者"外单内双"的格式,当然如果需要的是双引号本身,则只能 ...
- JavaScript调用后台的三种方法实例(包含两种Ajax)
方法一:直接使用<%=%>调用(ASPX页面) 前台JS,代码如下: <script type="text/javascript"> var methodS ...
- Poj 3368 Frequent values
/* 线段树区间合并 维护几个信息 到时候乱搞一下就好了 开始T了 有一种情况可以不用递归 直接算出来 */ #include<iostream> #include<cstdio&g ...