第八章 复杂数据类型与指针

   数据类型分为:基本;构造;指针;空类型
   基本就是常用的: 整型,浮点型,字符型
   构造数据类型又分为:数组;结构体;共用体;枚举

一、结构体

	结构体类型是把多种类型的数据组合起来的一种形式,有点像C++,JAVA中的类。它一个整体,封装了多个类型的多个数据,来表示一种对象的多个特征。
1.类型的声明形式
struct 结构名{
	类型1 成员名1;
	类型2 成员名2;
	类型3 成员名3;
}变量名1,变量名2;
或者
struct {
	类型1 成员名1;
	类型2 成员名2;
	类型3 成员名3;
}变量名1,变量名2
/*结构体与共用体*/
#include<stdio.h>
struct {
	int num;
	char name[10];
	char sex;
	char job;
	union {
		int class1;
		char position[10];
	}category;
} p[2];
main()
{
	int i,n;
	for(i=0;i<2;i++)
	{
		scanf("%d %s %c %c",&p[i].num,&p[i].name,&p[i].sex,&p[i].job);
		if(p[i].job=='s')
			scanf("%d",&p[i].category.class1);
		else if(p[i].job=='t')
			scanf("%s",&p[i].category.position);
		else
			printf("输入错误!");	
	}
	printf("\n");
	printf("ID	name		sex	job	class/position\n");
	for(n=0;n<2;n++)
	{
		if(p[n].job=='s')
			printf("%-6d	%-10s	%-3c	%-3c	%-6d\n",
			p[n].num,p[n].name,p[n].sex,p[n].job,p[n].category.class1);
		else if(p[n].job=='t')
			printf("%-6d	%-10s	%-3c	%-3c	%-6s\n",
			p[n].num,p[n].name,p[n].sex,p[n].job,p[n].category.position);	
	}
}

2.特点
   由很多特征组成;    
   结构体的每个特征成员都有自己的内存空间,且是独立的;
   内存分配对齐;
3.内存分配
   计算机为了方便读取,对内存分配做了一对齐:每个类型成员相对于结构体的首地址的偏移量是它本身类型字节大小的倍数,如int必须是 4 的倍数;然后每个成员的内存分配完了,总和必须是最长成员类型的倍数,如果有double则 总的大小必须是 8 的倍数。

二、共用体

	共用体是很多特征共用一个内存空间,大家一起用。
1.声明形式
union 共用名{
	类型1 成员名1;
	类型2 成员名2;
	类型3 成员名3;
}变量名1,变量名2;
 
2.特点
    内存大小是最大数据类型的长度,且只有一个空间;
    共用体变量起作用的是最后一次存放的成员,每次修改时覆盖上次的值;
    可以存放多种类型的数据;
    共用体变量的地址与成员地址相同;
    不能初始化;
 

三、枚举

	枚举就是把可能的值列出来,只能是整型数据。
1.声明形式
	enum 枚举名{变量名1[=1],变量名2[=2],变量名3[=3]};中间用逗号,
2.特点
	值是固定的几个;
	变量后面可以不赋值;默认从0开始,依次增1;
	当某个变量赋值以后,后面的变量依次增1;
	成员之间用逗号分隔
 

四、指针

1.意义
	指针就是一种指向其他变量的变量;它里面存放的是所指向变量的  地址 ;
2.声明形式
	int a=23;int *p=&a;
	指针与它所指向的变量的 类型必须一致;
	&是取地址运算符,得到一个变量在内存空间的地址;*是间接运算符,得到指针所指向的变量的值。
/*指针*/
#include<stdio.h>
main()
{
	int number=0;
	int *pointer=NULL;
	number=10;
	printf("\nnumber的地址为%p",&number);//输出变量number的地址16进制 
	printf("\nnumber的值为%d",number);//输出变量number的值
	pointer=&number;//给指针传递变量的地址 
	printf("\npointer地址为%p",&pointer);//输出指针pointer的地址16进制
	printf("\npointer的值为%d",pointer);//输出指针pointer的值10进制
	printf("\npointer的16进制值为%#x",pointer);//输出指针pointer的值16进制
	printf("\npointer的大小为%d",sizeof(pointer));//输出指针pointer的长度 
	printf("\n它指向的值为%d",*pointer);//输出指针pointer的指向变量的值 
}

3.应用
	int a=23;
	int *b,*p=&a;//取出变量a的地址,并传给指针变量p
	b=&a;//b也指向变量a
	*p=1;//把23传给指针变量p所指向的变量a,a的值变为1
	printf("%d",p);//输出p的  值  ,即里面的地址(变量a的地址)
	printf("%d",&p);//输出指针变量p的  本身的地址  ,即它自己在内存中的地址
	printf("%d",*p);//输出p所指向的变量的值,即(变量a的值)
	printf("%d",a);//输出a的值,与上面的效果一样,都是1
	取指针指向变量的值方式有:
	p[i],*(p+i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值