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语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
随机推荐
- Oracle中alter system命令参数之scope
SCOPE The SCOPE clause lets you specify when the change takes effect. Scope depends on whether you s ...
- springboot 配置文件 .properties和.yml的写法区别
例如 : redis配置的properties或yml文件,如下: spring.redis.cluster.nodes[]= spring.redis.cluster.nodes[]= 或 s ...
- 用于A*的 二叉堆 AS3实现
package com.copper.isometric.pathing { import flash.sampler.startSampling; /** * ...
- 关于lucene的IndexSearcher单实例,对于索引的实时搜索
Lucene版本:3.0 一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比 ...
- Haskell 差点儿无痛苦上手指南
趁着自己重装Linux 虚拟机的机会,把安装 haskell 的过程记录一下,顺便帮那些还犹豫徘徊在haskell门外的读者入门. 基本概念: Haskell : 是一门通用函数式语言,差点儿能够进行 ...
- Node.js【2】开发环境搭建(Windows、Linux&Mac)
安装方式有非常多种,以下仅仅是我喜欢的一种方式,安装的路径不一定要跟我一样. 眼下最新的版本号是v0.10.28 Windows 1.下载(放到E:\node\nodejs): http://node ...
- [转] restrict关键字用法
PS: 在函数中,指针参数指定了restrict,表示这个指针指向的这段区域只能通过这个指针修改 c99中新增加了一个类型定义,就是restrict. 看了下网上的相关贴子,但还是问题解决的不够.下面 ...
- 线程、委托、lambda运算符的简单示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Python开发【第一篇】:目录
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...
- qq第3方登录的JS实现方式记录
首先申请qq第3方登录接入的appkey和appid,具体方式http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth ...