zoukankan      html  css  js  c++  java
  • C语言~

    基本语法:

        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
    ", 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("请输入要创建的元素的个数:	");
    
        scanf("%d",&a);
    
        for(int i=0;i<a;i++){
    
        printf("请输入第%d个元素	",i+1);
    
        scanf("%d",&L.data[i]);
    
        L.length++;
    
      }
    }
    void show(SqList L){
    
        int i;
    
        printf("线性表中的元素为:
    ");
    
        for(i=0;i<L.length;i++)
    
        printf("%d	",L.data[i]);
    
        printf("
    ");
    
    }
    
    int main(){
        SqList L;
    
        L.length=0;//初始化线性表的长度为0
    
        creat(L);
    
        show(L);
     }
    

      

  • 相关阅读:
    git 常用命令
    svn常用命令
    mysql的bin或者sbin目录可执行文件
    SQL 函数
    SQL 通配符
    从一个Activity打开另外一个Activity
    断点下载数据
    多线程下载文件
    向服务器发送post请求
    android 查看网络图片
  • 原文地址:https://www.cnblogs.com/yizhizhangBlog/p/10039111.html
Copyright © 2011-2022 走看看