【学习笔记】【C语言】结构体
1.定义结构体变量的3种方式
1> 先定义类型,再定义变量(分开定义)
struct Student
{
int age;
};
struct Student stu;
2> 定义类型的同时定义变量
struct Student
{
int age;
} stu;
struct Student stu2;
3> 定义类型的同时定义变量(省略了类型名称)
struct
{
int age;
} stu;
2.结构体类型的作用域
1> 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
2> 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)
3.代码
1>结构体
/*
数组:只能由多个相同类型的数据构成 结构体:可以由多个不同类型的数据构成
*/
#include <stdio.h> int main()
{
//int ages[3] = {[2] = 10, 11, 27}; //int ages[3] = {10, 11, 29}; // 1.定义结构体类型
struct Person
{ // 里面的3个变量,可以称为是结构体的成员或者属性
int age; // 年龄
double height; // 身高
char *name; // 姓名
}; // 2.根据结构体类型,定义结构体变量
struct Person p = {, 1.55, "jack"};
p.age = ;
p.name = "rose"; printf("age=%d, name=%s, height=%f\n", p.age, p.name, p.height); /* 错误写法
struct Person p2;
p2 = {30, 1.67, "jake"};
*/ struct Person p2 = {.height = 1.78, .name="jim", .age=};
//p2.age = 25; return ;
}
2>结构体内存分析
#include <stdio.h>
int main()
{ return ;
} // 补齐算法
void test1()
{
struct Student
{
int age;// 4个字节 char a; //char *name; // 8个字节
}; struct Student stu;
//stu.age = 20;
//stu.name = "jack";
// 补齐算法(对齐算法)
// 结构体所占用的存储空间 必须是 最大成员字节数的倍数 int s = sizeof(stu);
printf("%d\n", s);
} // 结构体内存细节
void test()
{
// 1.定义结构体类型(并不会分配存储空间)
struct Date
{
int year;
int month;
int day;
}; // 2.定义结构体变量(真正分配存储空间)
struct Date d1 = {, , }; struct Date d2 = {, , }; // 会将d1所有成员的值对应地赋值给d2的所有成员
d2 = d1;
d2.year = ; printf("%d - %d - %d\n", d1.year, d1.month, d1.day); printf("%d - %d - %d\n", d2.year, d2.month, d2.day);
/*
printf("%p - %p - %p\n", &d1.year, &d1.month, &d1.day); int s = sizeof(d1);
printf("%d\n", s); */
}
3>注意点
#include <stdio.h>
// 从这行开始,一直到文件结尾,都是有效(跟全局变量一样)
struct Date
{
int year;
int month;
int day;
}; int a; void test2()
{
struct Date
{
int year;
};
// 这里使用的是test2函数内部的struct Date类型
struct Date d1 = {}; // 结构体类型也是有作用域,从定义类型的那一行开始,一直到代码块结束
struct Person
{
int age;
}; struct Person p; a = ;
} int main()
{
struct Date d1 = {, , }; test2(); // 不能使用test2函数中定义的类型
// struct Person p2; return ;
} // 定义结构体变量
void test()
{
// 定义结构体变量的第3种方式
struct {
int age;
char *name;
} stu; struct {
int age;
char *name;
} stu2; /*结构体类型不能重复定义
struct Student
{
int age;
}; struct Student
{
double height;
}; struct Student stu;
*/ /* 错误写法:结构体类型重复定义
struct Student
{
int age;
double height;
char *name;
} stu; struct Student
{
int age;
double height;
char *name;
} stu2;c
*/ /*
这句代码做了两件事情
1.定义结构体类型
2.利用新定义好的类型来定义结构体变量
*/
// 定义变量的第2种方式:定义类型的同时定义变量
/*
struct Student
{
int age;
double height;
char *name;
} stu; struct Student stu2;
*/ /*
// 定义变量的第1种方式:
// 1.类型
struct Student
{
int age;
double height;
char *name;
}; // 2.变量
struct Student stu = {20, 1.78, "jack"};
*/
}
4>结构体数组
int main()
{
struct RankRecord
{
int no; // 序号 4
int score; // 积分 4
char *name; // 名称 8
};
/*
struct RankRecord r1 = {1, "jack", 5000};
struct RankRecord r2 = {2, "jim", 500};
struct RankRecord r3 = {3, "jake",300};
*/ //int ages[3] = {10, 19, 29}; //int ages[3];
// 对齐算法
// 能存放3个结构体变量,每个结构体变量占16个字节
//
/*
int no; // 序号 4
char *name; // 名称 8
int score; // 积分 4
*/
//
/*
int no; // 序号 4
int score; // 积分 4
char *name; // 名称 8
*/
struct RankRecord records[] =
{
{, "jack", }, {, "jim", }, {, "jake",}
}; records[].no = ;
// 错误写法
//records[0] = {4, "rose", 9000}; for (int i = ; i<; i++)
{
printf("%d\t%s\t%d\n", records[i].no, records[i].name, records[i].score);
} //printf("%d\n", sizeof(records)); return ;
}
【学习笔记】【C语言】结构体的更多相关文章
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...
- 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!
前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...
- Swift 学习笔记 (类和结构体)
类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...
- matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段
一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...
- GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...
- iOS学习之C语言结构体
结构体:用来存放相同类型数据或者不同类型数据的自定义类型. 结构体定义(声明) struct 结构体名 { 成员变量1; 成员变量2; ... }; typedef 现有类型 新的类 ...
- APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍
以下不少内容来自man手册 结构体struct stat 结构体struct stat用于保存文件相关的所有信息. struct stat的基本成员如下所示 struc ...
- C#学习笔记_12_枚举&结构体
12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...
- C#学习笔记05--枚举/结构体
一.枚举 当变量的取值范围是固定的几个时, 就可以使用枚举类型, 这样会更加简洁方便 1.1.定义: 访问修饰符 enum 枚举类型名 { 成员1, 成员2, 成员3, ... } publi ...
随机推荐
- [Jobdu] 题目1531:货币面值
题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己.有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少, ...
- UVA 573 (13.08.06)
The Snail A snail is at the bottom of a 6-foot well and wants to climb to the top.The snail can cl ...
- 三星galaxy s4问题解决及快捷操作
http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...
- 生成html的几种方案
方案1: /// <summary > /// 传入URL返回网页的html代码 /// </summary > /// <param name=&q ...
- boost.asio源码剖析
一. 前 言二. 架构浅析三. 流程分析 * 常见流程分析之一(Tcp异步连接) * 常见流程分析之二(Tcp异步接受连接) * 常见流程分析之三(Tcp异步读写数据) ...
- 文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别
这两天在调优数据库性能的过程中需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改/proc/sys/vm/dirty_background_r ...
- 虚拟文件系统VFS
Linux的文件系统是由虚拟文件系统作为媒介搭建起来的,虚拟文件系统VFS(Virtual File System)是Linux内核层实现的一种架构,为用户空间提供统一的文件操作接口.它在内核内部为不 ...
- C#中String和string有什么区别
在C#中,string 是 System.String 的别名,所以基本上在使用时是没有差别的. 习惯上,我们把字符串当作对象时(有值的对象实体),我们用string.而我们把它当类时(需要字符串类中 ...
- CentOS 6.4 离线安装 Cloudera 5.7.1 CDH 5.7.1
因为项目开发需要要在本地组建一个Hadoop/Spark集群,除了Hadoop/Spark还要同时安装多个相关的组件,如果一个个组件安装配置,对于一个由多台服务器组成的集群来说,工作量是巨大的. 所以 ...
- Javascript教程:AngularJS的五个超酷特性
AngularJS是一个超棒的javascript框架,不单单对于开发人员来说非常有吸引力,对于UI设计师来说也同样出色.在这篇教程中,我们将简单的介绍AngularJS几个重量级必备特性,并且介绍它 ...