C语言课程中不重要但是工作中比较重要的知识点

指针一直都很重要

什么是指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

  type *var-name;   //type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称。
  int    *ip;    /* 一个整型的指针 */
  double *dp;    /* 一个 double 型的指针 */
  float  *fp;    /* 一个浮点型的指针 */
  char   *ch;     /* 一个字符型的指针 */ 

如何使用指针?

 #include <stdio.h>
  int main ()
  {
     int  var = 20;   /* 实际变量的声明 */
     int  *ip;        /* 指针变量的声明 */

     ip = &var;  /* 在指针变量中存储 var 的地址 */

     printf("Address of var variable: %p\n", &var  );

     /* 在指针变量中存储的地址 */
     printf("Address stored in ip variable: %p\n", ip );
   
     /* 使用指针访问值 */
     printf("Value of *ip variable: %d\n", *ip );

     return 0;
  }

指针详细使用方法

结构体

结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。

定义结构

  struct tag { 
      member-list
      member-list 
      member-list  
      ...
  } variable-list ;

tag 是结构体标签。member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。下面是声明 Book 结构的方式:

  struct Books
  {
     char  title[50];
     char  author[50];
     char  subject[100];
     int   book_id;
  } book;

结构体变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

  #include <stdio.h>

  struct Books
  {
     char  title[50];
     char  author[50];
     char  subject[100];
     int   book_id;
  } book = {"C 语言", "RUNOOB", "编程语言", 123456};

  int main()
  {
      printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
  }

访问结构成员

为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。
#include <stdio.h>
#include <string.h>

  struct Books
  {
     char  title[50];
     char  author[50];
     char  subject[100];
     int   book_id;
  };

  int main( )
  {
     struct Books Book1;        /* 声明 Book1,类型为 Books */
     struct Books Book2;        /* 声明 Book2,类型为 Books */

     /* Book1 详述 */
     strcpy( Book1.title, "C Programming");
     strcpy( Book1.author, "Nuha Ali"); 
     strcpy( Book1.subject, "C Programming Tutorial");
     Book1.book_id = 6495407;

     /* Book2 详述 */
     strcpy( Book2.title, "Telecom Billing");
     strcpy( Book2.author, "Zara Ali");
     strcpy( Book2.subject, "Telecom Billing Tutorial");
     Book2.book_id = 6495700;

     /* 输出 Book1 信息 */
     printf( "Book 1 title : %s\n", Book1.title);
     printf( "Book 1 author : %s\n", Book1.author);
     printf( "Book 1 subject : %s\n", Book1.subject);
     printf( "Book 1 book_id : %d\n", Book1.book_id);

     /* 输出 Book2 信息 */
     printf( "Book 2 title : %s\n", Book2.title);
     printf( "Book 2 author : %s\n", Book2.author);
     printf( "Book 2 subject : %s\n", Book2.subject);
     printf( "Book 2 book_id : %d\n", Book2.book_id);
   
     return 0;
  }

位域

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。
所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
典型的实例:

  • 用 1 位二进位存放一个开关量时,只有 0 和 1 两种状态。
  • 读取外部文件格式——可以读取非标准的文件格式。例如:9 位的整数。

共用体

一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。结构和使用方法和结构体类似。

定义共用体

  union [union tag]
  {
     member definition;
     member definition;
     ...
     member definition;
  } [one or more union variables];

union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的

  例:
  union Data
  {
     int i;
     float f;
     char  str[20];
  } data;

typedef

  • 用它为类型取一个新的名字。

    typedef unsigned char BYTE;
    BYTE  b1, b2;
    
  • 为用户自定义的数据类型取一个新的名字。

    #include <stdio.h>
    #include <string.h>
    
    typedef struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    } Book;
    
    int main( )
    {
       Book book;
    
       strcpy( book.title, "C 教程");
       strcpy( book.author, "Runoob"); 
       strcpy( book.subject, "编程语言");
       book.book_id = 12345;
    
       printf( "书标题 : %s\n", book.title);
       printf( "书作者 : %s\n", book.author);
       printf( "书类目 : %s\n", book.subject);
       printf( "书 ID : %d\n", book.book_id);
    
       return 0;
    }
    

typedef vs #define

#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

  • typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
  • typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

内存管理

链表

posted @ 2020-09-04 22:50  &honglu  阅读(144)  评论(0)    收藏  举报