结构体,共用体,typedef与define的区别,链表
2016-08-16 19:28
323 查看
首先自己发现的一点不懂的
定义:字符的赋值 char a='A';
char a[10]="A";
结构体:
1:结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型,不占用内存空间。
结构体变量才包含了实实在在的数据,需要内存空间来存储。
2:结构体里面不能对数据进行赋值(重点);
3:有名结构体
注意大括号后面的分号
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。
4:将不同类型的数据组合成一个整体----自定义数据类型
5:还有一种无名结构体 (固定选择范围),定义几个就只能使用几个(在结构体的末尾定义)
有结构体的想定义多少就多少;
取值:1: struct card card1;(第一种定义初始化)
取值 2:结构体末尾定义并初始化
}card1,card2;(第二种定义初始化) 定义后才可以使用
取结构体里面的数据 printf("%s,%d",card1.name,card1.age);
两种赋值方法
sprintf(card.name,"三只熊");
strcpy(card.name,"三只熊"); (需要用#include<string.h>来应用)
打印printf("%s",card.name);
整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
6:内存问题
理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,例如上面的结构体变量 card1、card2 的内存,共占用 4+4+4+1+4 = 17 个字节。 //指针数组是四个字节的
但是在编译器的具体实现中,各个成员之间可能会存在缝隙,对于
stu1、stu2,成员变量 group 和 score 之间就存在 3 个字节的空白填充。这样算来,stu1、stu2 其实占用了 17 + 3 = 20 个字节。
共用体:构造数据类型,,也叫联合体
用法和结构体的用法一样;
不同之处:在main函数里面,只能使用共用体一个变量,只会输出一个变量,就是最后赋值的那个
枚举类型 (取值范围)
typedef定义步骤
使用关键字 typedef 可以为类型起一个新的别名,语法格式为:
typedef oldName newName;
1:typedef没有创造新数据类型
2:typedef是定义类型,不能定义变量
typedef 还可以给①数组、③指针、②结构体等类型定义别名。
①
typedef char ARRAY20[20];
表示 ARRAY20 是类型
ARRAY20 a1, a2, s1, s2;
它等价于:
char a1[20], a2[20], s1[20], s2[20];
②,为结构体类型定义别名:
STU 是 struct stu 的别名,可以用 STU 定义结构体变量:
STU body1,body2;
它等价于:
struct stu body1, body2;
与#define的区别
1) 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做
#define INTERGE int
unsigned INTERGE n; //没问题
typedef int INTERGE;
unsigned INTERGE n; //错误,不能在 INTERGE 前面添加 unsigned
2) 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证
#define PTR_INT int *
PTR_INT p1, p2;
经过宏替换以后,第二行变为:
int *p1, p2;
这使得 p1、p2 成为不同的类型:p1 是指向 int 类型的指针,p2 是 int 类型。
链表:静态线性表
定义:字符的赋值 char a='A';
char a[10]="A";
结构体:
1:结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型,不占用内存空间。
结构体变量才包含了实实在在的数据,需要内存空间来存储。
2:结构体里面不能对数据进行赋值(重点);
3:有名结构体
struct card{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩 } card1, card2;
注意大括号后面的分号
;不能少,这是一条完整的语句。
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。
4:将不同类型的数据组合成一个整体----自定义数据类型
5:还有一种无名结构体 (固定选择范围),定义几个就只能使用几个(在结构体的末尾定义)
有结构体的想定义多少就多少;
取值:1: struct card card1;(第一种定义初始化)
取值 2:结构体末尾定义并初始化
struct{ //没有写 card char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩 } card1, card2;
}card1,card2;(第二种定义初始化) 定义后才可以使用
取结构体里面的数据 printf("%s,%d",card1.name,card1.age);
两种赋值方法
sprintf(card.name,"三只熊");
strcpy(card.name,"三只熊"); (需要用#include<string.h>来应用)
打印printf("%s",card.name);
struct{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };
整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
6:内存问题
理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,例如上面的结构体变量 card1、card2 的内存,共占用 4+4+4+1+4 = 17 个字节。 //指针数组是四个字节的
但是在编译器的具体实现中,各个成员之间可能会存在缝隙,对于
stu1、stu2,成员变量 group 和 score 之间就存在 3 个字节的空白填充。这样算来,stu1、stu2 其实占用了 17 + 3 = 20 个字节。
共用体:构造数据类型,,也叫联合体
用法和结构体的用法一样;
不同之处:在main函数里面,只能使用共用体一个变量,只会输出一个变量,就是最后赋值的那个
struct my{ char a[9]; double b; //a[9]有九个字节,double有8个字节, }me; //如果两者字节可整除,那最大字节为9,如果不能,那就是距离9最近的2的次方也就是2的四次方为16 void main(){ printf("%d",sizeof(me)); //得到的结果为16, }
枚举类型 (取值范围)
C语言typedef:给类型起一个别名
typedef定义步骤使用关键字 typedef 可以为类型起一个新的别名,语法格式为:
typedef oldName newName;
1:typedef没有创造新数据类型
2:typedef是定义类型,不能定义变量
typedef 还可以给①数组、③指针、②结构体等类型定义别名。
①
typedef char ARRAY20[20];
表示 ARRAY20 是类型
char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:
ARRAY20 a1, a2, s1, s2;
它等价于:
char a1[20], a2[20], s1[20], s2[20];
②,为结构体类型定义别名:
typedef struct stu{ char name[20]; int age; char sex; } STU;
STU 是 struct stu 的别名,可以用 STU 定义结构体变量:
STU body1,body2;
它等价于:
struct stu body1, body2;
与#define的区别
1) 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做
#define INTERGE int
unsigned INTERGE n; //没问题
typedef int INTERGE;
unsigned INTERGE n; //错误,不能在 INTERGE 前面添加 unsigned
2) 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证
#define PTR_INT int *
PTR_INT p1, p2;
经过宏替换以后,第二行变为:
int *p1, p2;
这使得 p1、p2 成为不同的类型:p1 是指向 int 类型的指针,p2 是 int 类型。
链表:静态线性表
//简单静态链表 #include<stdio.h> #include<stdlib.h> struct num{ int sum; struct num *p; //定义一个指针 }; void main(){ struct num n1,n2,n3,n4,n5,n6,n7; //定义 struct num *head=NULL; //头指针 同一个类型的两个不同指针 头指针指向第一个元素得到地址, n1.sum=1; //然后结构体的指针指向第二个元素地址,然后结构体的指针指向第三个元素地址, n2.sum=2; //最后那个元素的地址指向空(NULL) n3.sum=3; n4.sum=4; n5.sum=5; n6.sum=6; n7.sum=7; head=&n1; n1.p=&n2; n2.p=&n3; n3.p=&n4; n4.p=&n5; n5.p=&n6; n6.p=NULL; //删除元素 n3.p=&n5; n4.p=NULL; //插入元素 n3.p=&n7; n7.p=&n4; //增加元素 n6.p=&n7; n7.p=NULL; while(head!=NULL){ printf("%d\n",head->sum);//利用循环打印,比单独打印更方便 head=head->p; } system("pause"); }
相关文章推荐
- struct和typedef struct、enum与typedef enum、链表与结构体的区别
- struct和typedef struct、enum与typedef enum、链表与结构体的区别(转载)
- struct和typedef struct、enum与typedef enum、链表与结构体的区别
- typedef 和define的区别
- Linuxc - define 与 typedef的区别
- 转:c/c++中define与typedef的区别
- typedef和define的区别
- typedef和define作用域的区别
- typedef和define区别
- typedef 和define的区别
- typedef和define具体的详细区别
- C/C++ 之 typedef 和 define 的区别
- typedef和define具体的详细区别
- define与typedef的区别
- typedef 和 define的区别
- typedef与define的区别与联系
- typedef与define的区别
- typedef和define具体的详细区别
- typedef定义的struct类型与struct定义的结构体变量在使用上的区别
- typedef和define的区别