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语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
随机推荐
- 使用Java Mail发送邮件
本笔记参考自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17839983 JavaMail是SUN提供给开发人员在应用程序中实现 ...
- angularJS 过滤器 表单验证
过滤器1.filter的作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果,主要用于数据的格式化.2.内置过滤器(1)Currency(货币)将一个数值格式化为货币格式,默认为$(2)D ...
- Amazon API Gateway Importer整合过程小结
(1)需要将swagger json转换成amazon api gateway 所需要的格式(根据Method Request中 Request PathsURL Query String Param ...
- java_method_Log输出日志的方法
package cn.com.qmhd.tools; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigura ...
- SRM 207 Div II Level Two: RegularSeason,字符串操作(sstream),多关键字排序(操作符重载)
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=2866&rd=5853 主要是要对字符串的操作要熟悉,熟 ...
- Android 省市县 三级联动(android-wheel的使用)[转]
转载:http://blog.csdn.net/lmj623565791/article/details/23382805 今天没事跟群里面侃大山,有个哥们说道Android Wheel这个控件,以为 ...
- android 自定义progressDialog实现
我们在项目中经常会遇到这样一个应用场景:执行某个耗时操作时,为了安抚用户等待的烦躁心情我们一般会使用进度条之类的空间,在android中让 大家最容易想到的就是progressbar或者progres ...
- java 数据库两种连接方法
package jdbc; import java.sql.*; public class ConnectionDemo2 { public static final String DBDRIVER= ...
- C#自定义事件:属性改变引发事件示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- python3下的super()
大家都知道super是用来解决python钻石多重继承出现的基类重复调用的问题,这个就不赘述了,不了解的请点击. 但是我发现还有个问题在于不是钻石继承时继承先后顺序的问题,也就是如果mixin与继承的 ...