C学习笔记-结构体
结构体的定义和初始化
结构体是简单数据类型的综合
struct man
{
char name[100];
int age;
};
struct man m = { "tom", 12 };
struct man m = { .name = "tom", .age = 12 };
访问结构体成员
要访问结构体成员,要使用.
操作符。
m.age;
结构体的内存对齐模式
结构在内存的大小是和结构成员最长的那个元素相关的
编译器在编译一个结构的时候采用内存对齐模式
struct man{
char a;
int b;
};
//sizeof(struct man) = 8
指定结构体元素的位字段
定义一个结构体的时候可以指定具体元素的位长
struct test{
char a : 2;//指定元素为2位长,不是2个字节长
};
结构数组
struct man m[10] = { { "tom", 12 }, { "marry", 10 }, { "jack", 9 } };
m[1].name;
嵌套结构
一个结构的成员还可以是另一个结构类型
struct names{
char first[100];
char last[100];
};
struct man{
struct names name;
int age;
};
struct man m = { { "wang", "wu" }, 20 };
m.name.fist;//嵌套的使用
结构体的赋值
struct name a = b;
结构的赋值其实就是两个结构内存的拷贝
memcpy(&a, &b, sizeof(b));
如果结构体成员有指针元素,那么就不能直接赋值,原因是会指向同一块内存,使用free的话会造成没有实际指向
struct man
{
int age;
char *name;
};
int main()
{
struct man m1;
m1.age = 10;
m1.name = malloc(10);
strcpy(m1.name, "jack");
struct man m2;
m2.age = 12;
m2.name = malloc(strlen(m1.name) + 1);
strcpy(m2.name, m1.name);
}
指向结构体的指针
struct man m;
struct man *p = &m;
(*p).age = 10;//为操作简单,加入了->操作符
p->age = 10;
结构中的数组成员和指针成员
一个结构中可以有数组成员,也可以有指针成员
如果是指针成员结构体成员在初始化和赋值的时候就需要提前为指针成员分配内存
struct man
{
char name[100];
int age;
};
struct man
{
char *name;
int age;
};
在堆中创建的结构体
如果结构体有指针类型成员,同时结构体在堆中创建,那么释放堆中的结构体之前需要提前释放结构体中的指针成员指向的内存
struct man
{
char *name;
int age;
};
struct man *s = malloc(sizeof(struct man) * 2);
s[0].name = malloc(10 * sizeof(char));
s[1].name = malloc(10 * sizeof(char));
struct student
{
int ID;
char *name;
int age;
};
int main()
{
struct student *sp = malloc(sizeof(struct student) * 10);
memset(sp, 0, sizeof(struct student) * 10);
for (int i = 0; i < 10; i++)
{
sp[i].ID = i;
sp[i].age = i;
char buf[1024] = { 0 };
scanf("%s", buf);
int len = strlen(buf);//得到用户输入字符串的长度
sp[i].name = malloc(len + 1);
sprintf(sp[i].name, "%s", buf);
}
for (int i = 0; i < 10; i++)
{
printf("ID =%d, age = %d, name = %s\n", sp[i].ID, sp[i].age, sp[i].name);
}
for (int i = 0; i < 10; i++)
{
free(sp[i].name);
}
free(sp);
}
结构体作为函数参数
结构体作为函数参数,基本数据类型不会被改变,指针会被改变
func(struct student st)
{
st.age = 10;//原数值不会改变
strcpy(st.name, "zhang");//原数值会被改变
}
func(st)
结构指针作为函数参数,所有数据可改变
func(struct student *st)
{
st->age = 10;//原数值不会改变
strcpy(st->name, "zhang");//原数值会被改变
}
func(&st)
其根本原因是指向问题
如果一个结构体变量做为函数的参数,效率极低。同时老的C编译器都不支持传递结构变量,只支持传递结构指针
结构体指针做函数返回值
可以返回结构体,但一般不那么做,原因是结构体返回太大
struct str *getstr()
{
struct str *s = malloc(sizeof(struct str));
strcpy(s->buf, "hello world");
return s;
}
C学习笔记-结构体的更多相关文章
- c语言学习笔记 - 结构体位域
在学习结构体的时候遇到了位域这个概念,位域主要是为了节省内存空间,比如用一个32位,4个字节的int存储一个开关变量时,会造成空间浪费,于是干脆就考虑在这个32划分不同的区域来存储数据,例如划出1位存 ...
- C语言学习笔记--结构体
结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...
- go学习笔记-结构体
结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...
- C学习笔记-结构体与二进制文件增删改查
使用结构体整理数据,然后利用二进制存储文件,这样存储的文件类似于数据库,可以实现文件的增删改查 定义结构体 struct student { unsigned int ID; char name[20 ...
- AngularJS1.X学习笔记1-整体看看
听说 明天是愚人节,这与我有什么关系呢!我可 不想被愚弄,但是但是,我这么笨怎么才能不被愚弄呢?左思右想,我决定从现在开始闭关,闭关干啥哩?学习!学习AngularJS.以前学习过Angular的,不 ...
- Go笔记-结构体
[定义] type identifier struct{ field1 type1 field2 type2 ... } // 声明 var s identifier identifier.field ...
- C语言学习之结构体
前言 一直以来,C语言的学习都在入门阶段,只用到数组.函数.循环.选择.位运算这些基本的知识,较少用到指针.预处理.结构体.枚举类型.文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言 ...
- 瘋子C语言笔记(结构体/共用体/枚举篇)
(一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...
- C语言学习1——结构体剖析
一、定义结构体变量的方法 1.1先声明结构体类型在定义变量名 例如: a.声明结构体类型 struct student { int num; char name[20]; char sex; int ...
随机推荐
- POJ 2142 - The Balance [ 扩展欧几里得 ]
题意: 给定 a b n找到满足ax+by=n 的x,y 令|x|+|y|最小(等时令a|x|+b|y|最小) 分析: 算法一定是扩展欧几里得. 最小的时候一定是 x 是最小正值 或者 y 是最小正值 ...
- Remote API(RAPI)之 系统信息
RAPI提供了一些取系统信息的函数 CeGetSystemInfo:返回当前系统信息 CeGetSystemMetrics:获取Windows元素的尺寸和系统设置 CeGetVersionEx:获取当 ...
- removeAttr(name)
removeAttr(name) 概述 从每一个匹配的元素中删除一个属性 1.6以下版本在IE6使用JQuery的removeAttr方法删除disabled是无效的.解决的方法就是使用$(" ...
- android adb 命令发送 keyevent
使用Adb shell command直接送key event給Android adb shell input keyevent 7 # for key '0' adb shell input key ...
- Qbxt 模拟赛&&day-8
/* 今天的题目还是比较不错的. 今天考的很烂还是依旧的弱. 快考试了加油吧. Bless all. */ 注:所有题目的时间限制均为 1s,内存限制均为 256MB. 1.第K小数 (number. ...
- HZOJ 20190727 随(倍增优化dp)
达哥T1 实际上还是挺难的,考试时只qj20pts,还qj失败 因为他专门给出了mod的范围,所以我们考虑把mod加入时间复杂度. $50\%$算法: 考虑最暴力的dp,设$f[i][j]$表示进行$ ...
- node链接mongoDB及封装
// 这个模块中封装所有对数据库的常用操作 const MongoClient = require('mongodb').MongoClient; const assert = require('as ...
- JavaWeb-SpringBoot_使用MySQL管理用户登录注册+接入腾讯短信SDK_demo
使用Gradle编译项目 传送门 项目已托管到Github上 传送门 JavaWeb-SpringBoot_一个类实现腾讯云SDK发送短信 传送门 用户注册 用户并非一定要输入正确的手机验证码去激活当 ...
- Nginx数据结构之红黑树ngx_rbtree_t
1. 什么是红黑树? 1.1 概述 红黑树实际上是一种自平衡二叉查找树. 二叉树是什么?二叉树是每个节点最多有两个子树的树结构,每个节点都可以用于存储数据,可以由任 1 个节点访问它的左右 子树或父节 ...
- LeetCode 137. 只出现一次的数字 II(Single Number II)
题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...