基本语法:

    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);
 }