您的位置:首页 > 编程语言 > C语言/C++

结构体,共用体,typedef与define的区别,链表

2016-08-16 19:28 323 查看
首先自己发现的一点不懂的

定义:字符的赋值 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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 typedef