基本语法:
typedef 已有数据类型 新的数据类型名;
根据自己的需要,对数据类型重新定义。用到关键字typedef
其中“已有的数据类型”是指上面所介绍的C语言中所有的数据类型,包括结构、指针
和数组等,“新的数据类型名”可按用户自己的习惯或根据任务需要决定。
插入背景:
elem是单词element(元素)的缩写,在程序定义中代表某一不确定的类型,也就是抽象的数据类型
为了使程序可读性强,并且便于修改,让elem代表多种的数据类型
也就是为int、char等等的数据类型,起了一个别名
在头文件中定义:typedef char elem; /* 抽象元素类型为char类型,这样定义之后,下面的程序中elem所定义的元素就是char类型的了 */
如果需要修改其类型,直接修改char到其他类型,elem便又代表了所修改的类型数据,这也是方便性的体现。
使用:typedef int ElemType;//定义ElemType为int类型
你想让它是什么类型自己用typedef重定义就行。
也可以用模板表示,类似template<class T>里面的T。
这对于初学数据结构的学生来说理解起来有些难度,为了利于理解,我们可以把”ElemType“等同于”一套房子“来理解:
“一套房子”的含义大家都非常清楚,但一套房子的具体含义是因人而异的,有的认为是“四室二厅”,有的认为是“二室一厅”,也有的认为是“一室一厅”,对此大家也没有任何异议!其实ElemType也是这样的,它有时表示“整型”,有时表示“用户自定义的结构体”,也可以是其他形式的类型自由表示!
在《数据结构》中,关于数据元素的类型定义均用“ ElemType e;”来表示,
其中e是表示数据元素的变量,而ElemType则是它的类型,ElemType的含义就是“数据元素的类型”,是一个抽象的概念,是表示我们所要使用的数据元素应有的类型
举例结构体的定义:
struct student //结构体类型的说明与定义分开。 声明
{
int age; /*年龄*/
float score; /*分数*/
char sex; /*性别*/
};
备注:C结构体定义 如下
#include <stdio.h>
struct student //结构体类型的说明与定义分开。 声明
{
int age; /*年龄*/
float score; /*分数*/
char sex; /*性别*/
};
int main ()
{
struct student a={ 20,79,'f'}; //定义
printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
return 0;
}
指针与地址运算符:
C语言提供了两个专门的运算符:
* 取内容; & 取地址
变量= * 指针变量
指针变量= & 目标变量
取内容运算是将指针变量所指向的目标变量的值赋给左边的变量;取地址运算是将目标变量的地址赋给左边的变量。
分配内存空间函数(函数原型):
void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
注意:
而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。
第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:
int* p = (int *) malloc (1);
代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。
此处在线性表 顺序结构的定义用的上
malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。
比如想分配100个int类型的空间:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。
但是 与new [] 不同的 是 malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
踩坑:
验证函数“引用传递”的时候,出现了错误提示:[Error] expected ';', ',' or ')' before '&' token
编译时候会出现 ‘error: expected ';', ',' or ')' before '&' token’ 这个错误提示呢,很多同学在这一点上无法理解,明明语法上并无错误,为什么呢?
其实这就是C语言的一个知识点:
在C语言中是不存在引用的,也就是说C语言中&表示的不是引用,而是取地址符。所以编译器出现的错误提示表明&在这里不能这样用,如何解决这个问题呢?
1、常规的解决方法:用指针来取代引用,在主函数中传进来地址;
2、将代码扩展名保存成.cpp文件
为什么?
我们可以认为,c不认引用传递,但是c++支持引用传递啊!
举例子:创建线性表举例
#include <stdio.h>
#include <malloc.h> //分配空间
#define MAXSZIE 20
#define Error 0
#define OK 1
typedef int Staus;
typedef struct{
int data[100];
int length; //存线性表的当前长度
}SqList; //分配的存储总容量
void creat(SqList &L){
int a;
printf("请输入要创建的元素的个数:\t");
scanf("%d",&a);
for(int i=0;i<a;i++){
printf("请输入第%d个元素\t",i+1);
scanf("%d",&L.data[i]);
L.length++;
}
}
void show(SqList L){
int i;
printf("线性表中的元素为:\n");
for(i=0;i<L.length;i++)
printf("%d\t",L.data[i]);
printf("\n");
}
int main(){
SqList L;
L.length=0;//初始化线性表的长度为0
creat(L);
show(L);
}