C语言刷题常用基础知识
3859
2023.03.30
2023.03.30
发布于 未知归属地

C语言刷题常用基础知识

一、数组

  1. 数组的申请
    a. 一维数组的申请
       int* num = (int*)malloc(sizeof(int) * 10);
    b. 二维数组的申请
       int** num = (int**)malloc(sizeof(int*) * 10);
       for (int i = 0; i < 10; i++) {
           num[i] = (int*)malloc(sizeof(int) * 10);
       }
    c. 数组都赋0值
    对于malloc申请的数组要这样:
       int* num = (int*)malloc(sizeof(int) * 10);
       memset(num, 0, sizeof(int) * 10);
    对于非malloc申请的数组要这样:
       int num[10];
       memset(num, 0, sizeof(num));
  2. 比较函数(入参为malloc申请的数组)
    a. 一维数组
       int cmp(const void* a, const void* b) {
           int* aa = (int*)a;
           int* bb = (int*)b;
           //return *aa - *bb; //从小到大排序
           return *bb - *aa; //从大到小排序
       }
    b. 二维数组
       //假设数组是2列
       int cmp(const void* a, const void* b) {
           int* aa = *(int**)a;
           int* bb = *(int**)b;
           //0列相同时,比较1列
           if (aa[0] == bb[0]) {
               //return aa[1] - bb[1]; //从小到大排序
               return bb[1] - aa[1]; //从大到小排序
           }
           //0列不相同时
           //return aa[1] - bb[1]; //从小到大排序
           return bb[1] - aa[1]; //从大到小排序
       }
    比较函数有了后,就可以进行排序,用qsort
       //比如对 int* nums 进行排序,数组大小为10,比较函数为cmp
       //第一个参数为数组,第二个参数为数组大小,第三个参数为数组里单个元素的大小,第四个参数为比较函数cmp
       qsort(nums, 10, sizeof(int), cmp); 
  3. 力扣实现函数中 int* returnSizeint** returnColumnSize 的说明
    int* returnSize 用来存二维数组的行的大小,用指针是方面时实修改大小,比如有10行,就这样写:
    *returnSize = 10;
    int** returnColumnSize 用来存二维数组列的大小,这里是用二维指针存,第一维用来指向这个数组,第二维用来指向每列的大小,给returnColumnSize赋值的时候要先申请空间,比如有size列,每列大小都为10,就这样写:
    *returnColumnSize = (int*)malloc(sizeof(int) * size);
    for (int i = 0; i < size; i++) {
        (*returnColumnSize)[i] = 10;
    }

二、字符串

常用字符串函数有如下这些:

   strstr(arr, tmp); //在arr中从左到右查找第一个tmp,找到返回tmp开头的字符串的指针
   strchr(arr, ch); //在arr判断是否有ch这个字符,没有的话返回NULL,有的话返回非空
   strcmp(arr1, arr2); //比较arr1和arr2的大小,arr1大返回正值,arr1小返回负值,arr1和arr2相等返回0
   strcpy(arr, tmp, tmp_size); //把tmp字符串复制到arr字符串里
   strcat(arr, tmp); //将tmp字符串拼接到arr字符串的末尾
   strtok(arr, tmp); //按tmp分割字符串arr,返回第一个分割的部分

这里把完整的分割字符串过程写一下:

   //strtok会使原字符串arr会变化成去掉第一个分割后的剩余字符串,所以分割前请先复制原串
   //这里假设被分割成row个,每个的长度最长为col,用out来存每个分割部分
   char** out = (char**)malloc(sizeof(char*) * row);
   int idx = 0;
   char* p = strtok(arr, tmp);
   while (p != NULL) {
       out[idx] = (char*)malloc(sizeof(char) * (col + 1)); //加1是字符串有结尾字符'/0'
       out[idx++] = p;
       p = strtok(NULL, tmp); //这里要用NULL
   }

三、指针
指针是C语言中比较常用的类型,也是C语言的灵魂,也是难点,出错点。主要还是知道到底想要表达什么意思也就自然而然了。指针是地址的意思,不同类型的变量所需地址空间大小不一样,所以也就需要区分不同类型的指针。“*”表示指针,“&”表示取地址。在判断指针是指向什么类型的时候,可以把变量去掉,剩下的就是指针所指向的。

   int* a; //指向整型的指针,指向 int*
   int** a; //指向整型指针的指针,指向 int**
   int* a[n]; //指针数组,每个数组成员都是一个整型指针,int*,总共有n个指针
   (int*)a[n]; //数组指针,指向数组的指针,指向(int*)[],总共就1个指针
   int* func(); //指针函数,函数的返回值是1个指针
   (int*)func(); //函数指针,指向函数的指针,指向(int*)(),总共就1个指针
说明:指针类型的变量的值是随时变化的,相当于全局变量,所以在函数传参数的时候,如果要实时保留值的变化,就传入指针类型变量或者全局变量。

与指针相关的数据结构,如列表、树等,在后面算法总结中再书写。

评论 (8)