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语言】结构体的更多相关文章

  1. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  2. matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  3. 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!

    前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...

  4. Swift 学习笔记 (类和结构体)

    类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...

  5. matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段

    一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...

  6. GO学习-(38) Go语言结构体转map[string]interface{}的若干方法

    结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...

  7. iOS学习之C语言结构体

    结构体:用来存放相同类型数据或者不同类型数据的自定义类型. 结构体定义(声明) struct 结构体名 {    成员变量1;    成员变量2;    ... }; typedef 现有类型 新的类 ...

  8. APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍

    以下不少内容来自man手册 结构体struct stat         结构体struct stat用于保存文件相关的所有信息.         struct stat的基本成员如下所示 struc ...

  9. C#学习笔记_12_枚举&结构体

    12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...

  10. C#学习笔记05--枚举/结构体

    一.枚举   当变量的取值范围是固定的几个时, 就可以使用枚举类型, 这样会更加简洁方便   1.1.定义: 访问修饰符 enum 枚举类型名 { 成员1, 成员2, 成员3, ... } publi ...

随机推荐

  1. Codeforces Beta Round #6 (Div. 2 Only) E. Exposition multiset

    E. Exposition Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/ ...

  2. shader 语言 【转】

    shader语言 3dlabs改名后其开发者网站关闭 可以在这里下载shadergen http://3dshaders.com/home/index.php?option=com_weblinks& ...

  3. Redis 安装与简单示例 <第一篇>

    一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...

  4. [MEAN+ Webstrom] First API -- 2.Debug Node.js RESTful application

    Using WebStrom can easily debug the Node applcation. For example, we have an Node+Express applicatio ...

  5. iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果

    8行代码教你搞定导航控制器全屏滑动返回效果 前言 如果自定了导航控制器的自控制器的leftBarButtonItem,可能会引发边缘滑动pop效果的失灵,是由于 self.interactivePop ...

  6. IOS试题收集1

    IOS试题收集1 1.Objective C中有多继承吗?没有的话用什么代替? Protocol 2.Objective C中有私有方法吗?私有变量呢? OC类里面只有静态方法和实例方法这两种,@pr ...

  7. 剑指 offer set 3 旋转数组的最小数字

    总结 1. 没有重复元素的旋转数组可用 logn 时间内求出结果. 解法有两个步骤, 先是求出发生旋转的点(以 array[0] 为支点求得), 然后用正常的二分查找给出结果 2. 有重复元素元素的旋 ...

  8. MySQL数据库InnoDB存储引擎中的锁机制

    MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...

  9. 关于android的屏幕保持常亮

    实现这一功能的方法有两种,一种是在Manifest.xml文件里面声明,一种是在代码里面修改LayoutParams的标志位.具体如下: 1.在Manifest.xml文件里面用user-permis ...

  10. Cassandra在CQL语言层面支持多种数据类型

    Cassandra在CQL语言层面支持多种数据类型. CQL类型 对应Java类型 描述 ascii String ascii字符串 bigint long 64位整数 blob ByteBuffer ...