C语言中 .11f,C语言学习11.其他复杂数据类型

结构体(struct):

若干个相同或不同类型的数据构成的集合,构成结构体的数据称为结构体的数据成员。

结构体类型是一种自定义的数据类型,不是系统预定义的数据类型,所以在使用之前要声明结构体类型,然后再使用。

结构体的定义和初始化

struct student

{

unsigned num;

char name[20];

char sex;

int age;

float score;

}student1,student2;//在声明结构体类型的同时定义结构体变量

或者struct student a;

声明匿名结构体类型,需同时定义结构体变量。

truct student1={288829,"kafdk",'m'}; //全部初始化,局部初始化

typedef:给类型起别名

与#define之间的区别:

#define INT_Q int* //单纯的替换,不考虑正确性

typedef int* INT_R; // 起别名,考虑正确性

INT_Q q1,q2;//q1是指针,q2是整型变量

INT_R r1,r2;//都是指针,引入了一个新的助记符

结构体变量所占存储空间的大小至少为其所以成员所占空间的总和,还要考虑字节对齐机制的影响

http://blog.csdn.net/happy_teemo/article/details/52180000

结构体的内存布局:所有数据成员按照定义顺序由低地址向高地址依次连续存放

结构体的访问

average=(student1.soure+student2.soure+student3.soure)/3;

//和数组一样,不能整体访问,只能访问它的数据成员

//.为成员运算符,作用为获取结构体的数据成员

//通过结构体变量的指针访问其数据成员

struct student* p=&a1;

p->name="ajsdhk"; //->为指向运算符,作用为获取结构体的数据成员

printf("%s\n",p->name);

//堆区结构体

struct book* p=(struct book*)malloc(sizeof(struct book));

typedef struck student

{ int id;}stu;

Stu.id=(*stu).id=stu->id

//将一个结构体变量赋给另外一个结构体变量;必须类型相同

typedef struct person

{

int id;

char sex;

float sight;

char name[100];

}person;

int main

{

person p1;

struct person p2;

p1.id = 1001;//取结构体成员 等效于:*(int)&p1 = 1001; (取值---转换---指向----赋值)

//下面两句编号无区别,内容有区别,基类型不同

&p1;//指向结构体(整体第一个)

&(p1.id);//指向int(int第一个)

return 0;

}

结构体的输入输出:

printf("%u,%s,%c",num,name,sex);

scanf("&u,%s,%c",&student1.num,student1.name,&student.sex);

name[]是字符数组,所以不加&

结构体的嵌套使用:

结构体的数据成员为结构体类型

联合或公用体(union):

公用体类型让几个不同类型的变量存放在同一个内存区域中,这几个变量的起始地址是一样的,系统使用的数据值覆盖存储的方式使得这些不同类型的变量在同一时刻只有一个能起作用。

和结构体一样,也是自定义数据类型,用法基本相同,但不同的是结构体的数据成员都有自己独立的内存空间,而公用体的所有成员公用一块内存空间,所有共同体的首地址相同。

定义的同时只能用第一个成员的类型的值进行初始化

公用体所占存储空间大小由它的数据成员中占存储空间最大的决定

在某一时刻,只有一个数据成员有意义

访问最近被赋值的数据成员才有意义

枚举(enum):

也是自定义数据类型,表示取值只有有限种情况的数据

enum sex {male,female};//male,female称为枚举常量

其实枚举常量代表一个整数值,默认情况下从0开始

枚举值是常量,不是变量。

枚举和共用体的例子:

#include

#include

#include

#include

enum NumType // 声明一个枚举类型来描述要输出的类型

{

INTEGER_INT, // 整型类型

INTEGER_LONG, // 长整型类型

INTEGER_DOUBLE // DOUBLE类型

};

union NumValue // 声明一个包含下面三种类型的共用体

{

int iValue; // int类型值

long lValue; // long类型值

double dValue; // double类型值

};

int main( int argc, char *argv[] )

{

int count = argc - 1; // 计算输入的参数个数

NumValue *Values = new NumValue[count]; // 存放值的共用体

NumType *Types = new NumType[count]; // 存放类型的数组

for( int i = 1; i < argc; ++i ) // 循环处理每个参数

{

if( strchr( argv[i], '.' ) != 0 ) // 判断输入参数中是否包含小数点

{

Values[i].dValue = atof( argv[i] ); // 为dValue成员赋值,并记录类型。

Types[i] = INTEGER_DOUBLE; // 记录数组的成员的类型为DOUBLE型

}

else // 不是Floating类型

{

if (( atol( argv[i] ) > INT_MAX ) || (atol( argv[i] ) < 0))

{

// 如果数据大于int类型的最大值,则将其存储在lValue成员中,并记录类型

Values[i].lValue = atol( argv[i] ); // 将值转换成长整型

Types[i] = INTEGER_LONG; // 记录数组的成员的类型为长整型

}

else

{

// 否则,将其存储在iValue成员中,并记录类型

Values[i].iValue = atoi( argv[i] ); // 将值转换成整型

Types[i] = INTEGER_INT; // 记录数组的成员的类型为整型

}

}

switch( Types[i] ) // 根据类型种类,将种类信息和值信息输出

{

case INTEGER_INT: // 如果数据为整型,输出整型值

printf( "数据类型为Integer,值为%d\n", Values[i].iValue );

break;

case INTEGER_LONG: // 如果数据为长整型,输出长整型值

printf( "数据类型为Long,值为%d\n", Values[i].lValue );

break;

case INTEGER_DOUBLE: // 如果数据为double型,输出double值

printf( "数据类型为Double,值为%f\n", Values[i].dValue );

break;

}

}

//system("pause");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值