C Abstract——Struct 结构体
2015-07-08 18:48
323 查看
最近在研究Linux内核模块编程,遇到最多的就是结构,屡屡碰到一些生疏的用法如位域,成员初始化,于是便想着回顾一下。
结构体是什么?结构体是一系列变量的组合,就像C++中的类,结构体的在声明时不会分配内存空间,故而在使用时需要定义结构体变量。从本质上来说,结构体变量就是一片内存空间,但是我们对这篇内存中的存放内容进行了限定。
到这就会出现两个基本问题,一是结构体变量如何定义;一是结构体变量分配的空间是多大。基于这两个问题给出如下程序进行说明:
#include <stdio.h>
struct student{
char name[15];
int age;
};
struct student student_a;
typedef struct student stu;
stu student_b;
int main(int argc, char* argv[])
{
printf("struct student size %d.\n", sizeof(struct student));
printf("student_a size %d.\n", sizeof(student_a));
printf("student_b size %d.\n", sizeof(student_b));
return 0;
}
由上述程序可以看出结构体定义与变量定义差别不大,需要注意的是变量的类型为 struct 类型名 ,struct不可忽略。然而为方便起见,可以使用typedef来重新定义一个结构体类型名。至于结构体所占的空间,存在一个内存对齐,即是与最长变量对齐,如果最长变量超过计算机的字长则已计算机字长为对齐单位,上述输出结果为20。
需要注意的是结构体中位域的概念,位域的实现是以bit为最小单位来存储变量,在定义时在变量名后加:num,num为变量需要的比特数,在分配时遵循一个变量不跨越多个不完整字节,且变量类型为无符号型或者整型,宽度为0的位域会强制讲下一个位域分配新的字节中,下例给出的结构体占两个字节:
struct test{
unsigned char a:3;
unsigned char b:4;
unsigned char c:2;
};
接下来就是结构体的初始化,结构体的初始化方式有很多,常见的几种方式如下:
1.花括弧内用逗号隔开直接初始化;
2.花括号内成员名前加上成员运算符"."赋值;
3.对变量名.成员名逐个赋值;
注:凡是进行初始化而又未进行复制的成员默认会初始化为0(数值为0,字符串为'\0',指针为NULL)。
似乎也没什么可讲的,后面有相关疑问再补充!
结构体是什么?结构体是一系列变量的组合,就像C++中的类,结构体的在声明时不会分配内存空间,故而在使用时需要定义结构体变量。从本质上来说,结构体变量就是一片内存空间,但是我们对这篇内存中的存放内容进行了限定。
到这就会出现两个基本问题,一是结构体变量如何定义;一是结构体变量分配的空间是多大。基于这两个问题给出如下程序进行说明:
#include <stdio.h>
struct student{
char name[15];
int age;
};
struct student student_a;
typedef struct student stu;
stu student_b;
int main(int argc, char* argv[])
{
printf("struct student size %d.\n", sizeof(struct student));
printf("student_a size %d.\n", sizeof(student_a));
printf("student_b size %d.\n", sizeof(student_b));
return 0;
}
由上述程序可以看出结构体定义与变量定义差别不大,需要注意的是变量的类型为 struct 类型名 ,struct不可忽略。然而为方便起见,可以使用typedef来重新定义一个结构体类型名。至于结构体所占的空间,存在一个内存对齐,即是与最长变量对齐,如果最长变量超过计算机的字长则已计算机字长为对齐单位,上述输出结果为20。
需要注意的是结构体中位域的概念,位域的实现是以bit为最小单位来存储变量,在定义时在变量名后加:num,num为变量需要的比特数,在分配时遵循一个变量不跨越多个不完整字节,且变量类型为无符号型或者整型,宽度为0的位域会强制讲下一个位域分配新的字节中,下例给出的结构体占两个字节:
struct test{
unsigned char a:3;
unsigned char b:4;
unsigned char c:2;
};
接下来就是结构体的初始化,结构体的初始化方式有很多,常见的几种方式如下:
1.花括弧内用逗号隔开直接初始化;
2.花括号内成员名前加上成员运算符"."赋值;
3.对变量名.成员名逐个赋值;
注:凡是进行初始化而又未进行复制的成员默认会初始化为0(数值为0,字符串为'\0',指针为NULL)。
似乎也没什么可讲的,后面有相关疑问再补充!
相关文章推荐
- 02-单例-通知-KVO-Block-代理
- 数据结构课程设计论文--学生信息管理系统
- json
- Nginx反向代理实现负载均衡配置图解
- MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticModuleState()
- Android(java)学习笔记119:继承中父类没有无参构造
- 安装SQL Server提示“重叠的IO操作正在进行”解决
- 01-自动布局 AutoResizing VFL Autolayout
- nginx中针对目录进行IP限制
- 二、 零代码实战 SharePoint 2013 BCS:准备篇
- 初学_Android4高级编程-7 异步http框架得到有道翻译的XML与json资源并解析出需要的数据&使用DownloadManager
- ssh 配置讲解大全
- 开启Nginx的gzip压缩功能详解
- [bat] DIR命令详解
- shell学习四十一天----列出文件ls和od命令
- RSync实现文件备份同步
- How to: Implement a Windows Communication Foundation Service Contract
- Windows XP SP3远程桌面连接支持网络级身份验证配置
- Critical Section Object
- 在云服务器主机环境(不支持组播)基于单播模式的Tomcat Cluster集群配置