- @TOC 前言前面我们学习了一级指针操作变量,那什么是二级指针?二级指针又如何操作变量呢? 一、二级指针的声明定义:二级指针定义:int a = 12; / / a变量有自己的空间地址,假设为 0x10, 里面装 12int *p = &a; / / p变量有自己的空间地址,假设为 0x20, 里面装 0x10int **pp = &p; / / pp变量有自己的空间地址,假设为 ... @TOC 前言前面我们学习了一级指针操作变量,那什么是二级指针?二级指针又如何操作变量呢? 一、二级指针的声明定义:二级指针定义:int a = 12; / / a变量有自己的空间地址,假设为 0x10, 里面装 12int *p = &a; / / p变量有自己的空间地址,假设为 0x20, 里面装 0x10int **pp = &p; / / pp变量有自己的空间地址,假设为 ...
- @TOC 前言之前我们讲了指针数组,今天讲一下数组指针。 一、数组与指针的概述:数组指针就是数组的指针,就是***指向数组的指针。***int a [5] = {1,2,3,4,5}; / / 定义一个数组int *p = &a[0]; / / 定义一个指针指向数组的首地址,由于 数组的首地址就是数组名,所以&a[0]==a; 则可写为 int * p = a;则此时的***指针... @TOC 前言之前我们讲了指针数组,今天讲一下数组指针。 一、数组与指针的概述:数组指针就是数组的指针,就是***指向数组的指针。***int a [5] = {1,2,3,4,5}; / / 定义一个数组int *p = &a[0]; / / 定义一个指针指向数组的首地址,由于 数组的首地址就是数组名,所以&a[0]==a; 则可写为 int * p = a;则此时的***指针...
- @TOC 前言 一、函数返回值:例如:int fun (void) / /有返回值函数{printf(“Hellow world!\n”);return 2; / / 返回值可以是任意数值,将12 返回给 fun().} 二、return 的应用:return 的作用:在有返回值的函数里:结束函数,返回一个值。在没有返回值的函数里:结束函数。结束这个功能就像是循环中的break,直接跳出函... @TOC 前言 一、函数返回值:例如:int fun (void) / /有返回值函数{printf(“Hellow world!\n”);return 2; / / 返回值可以是任意数值,将12 返回给 fun().} 二、return 的应用:return 的作用:在有返回值的函数里:结束函数,返回一个值。在没有返回值的函数里:结束函数。结束这个功能就像是循环中的break,直接跳出函...
- @TOC 前言 一、递归的理解:递归函数:函数自己调用自己的,叫做递归调用。例如:void fun(void){printf ( “Hellow!” );fun();} 二、循环角度理解递归:递归的本质就是循环。循环可以完全代替递归,但是递归在某些情况下代码会更简洁一点。可控递归三要素:void fun(int i) // 1.循环控制变量{if (i < 5) //2.循环的条件{pr... @TOC 前言 一、递归的理解:递归函数:函数自己调用自己的,叫做递归调用。例如:void fun(void){printf ( “Hellow!” );fun();} 二、循环角度理解递归:递归的本质就是循环。循环可以完全代替递归,但是递归在某些情况下代码会更简洁一点。可控递归三要素:void fun(int i) // 1.循环控制变量{if (i < 5) //2.循环的条件{pr...
- @TOC 前言 一、函数指针:函数也有地址,叫做函数地址:***& fun() ;***特点:函数名就是函数的地址:fun == & fun类型:去掉函数名,就是函数类型,比如:int fun ( int a, double b )的函数类型是 int ( int a, double b )函数指针就是: int ( * p) ( int a, double b ) = fun() ;定... @TOC 前言 一、函数指针:函数也有地址,叫做函数地址:***& fun() ;***特点:函数名就是函数的地址:fun == & fun类型:去掉函数名,就是函数类型,比如:int fun ( int a, double b )的函数类型是 int ( int a, double b )函数指针就是: int ( * p) ( int a, double b ) = fun() ;定...
- C 的令牌(Tokens)C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的 C 语句包括五个令牌:printf("Hello,World! \n");这五个令牌分别是: printf ( "Hello,World! \n" ) ;分号 ;在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实... C 的令牌(Tokens)C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的 C 语句包括五个令牌:printf("Hello,World! \n");这五个令牌分别是: printf ( "Hello,World! \n" ) ;分号 ;在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实...
- 执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,检查命令行是否有提供参数,并根据参数执行相应的动作:#inclu... 执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,检查命令行是否有提供参数,并根据参数执行相应的动作:#inclu...
- 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重... 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重...
- 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 过程演示:#include <stdio.h>void swap(int *, int *);void selection_sort(... 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 过程演示:#include <stdio.h>void swap(int *, int *);void selection_sort(...
- 冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。 过程演示:#include <stdio.h>void bubble_sort(int [], int);void swap(int *,int*);int main() { int arr[] = {3, 1,... 冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。 过程演示:#include <stdio.h>void bubble_sort(int [], int);void swap(int *,int*);int main() { int arr[] = {3, 1,...
- 生活中我们经常能见到TopK问题,例如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。所以,TopK问题即求出一组数据中前K个最大或最小的元素,一般情况下,数据量都比较大。对于TopK问题,我们首先想到的可能是排序,对数据排好序以后,取前K个元素。但是,面对庞大的数据量时,排序并不适用,因为加载庞大的数据到内存中是个不小的消耗。所以,对于TopK问题,最佳的解决方式是用堆 生活中我们经常能见到TopK问题,例如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。所以,TopK问题即求出一组数据中前K个最大或最小的元素,一般情况下,数据量都比较大。对于TopK问题,我们首先想到的可能是排序,对数据排好序以后,取前K个元素。但是,面对庞大的数据量时,排序并不适用,因为加载庞大的数据到内存中是个不小的消耗。所以,对于TopK问题,最佳的解决方式是用堆
- 认识二叉树结构最简单的方式就是遍历二叉树。所谓遍历二叉树就是按照某种特定的规则,对二叉树的每一个节点进行访问,且每个节点只访问一次。二叉树遍历的规则一般有四种:前序遍历、中序遍历、后序遍历和层序遍历。其中,前三种较为简单且实现方式大同小异。1.前序遍历:先访问根节点,再遍历左右子树;2.中序遍历:先遍历左子树,再访问根节点,再遍历右子树;3.后序遍历:先遍历左子树,再遍历右子树,再访问根节点。简单 认识二叉树结构最简单的方式就是遍历二叉树。所谓遍历二叉树就是按照某种特定的规则,对二叉树的每一个节点进行访问,且每个节点只访问一次。二叉树遍历的规则一般有四种:前序遍历、中序遍历、后序遍历和层序遍历。其中,前三种较为简单且实现方式大同小异。1.前序遍历:先访问根节点,再遍历左右子树;2.中序遍历:先遍历左子树,再访问根节点,再遍历右子树;3.后序遍历:先遍历左子树,再遍历右子树,再访问根节点。简单
- 计数排序是一种非比较排序。它的主要思想是建立一个临时数组 CountArr ,用来统计序列中每个元素出现的次数,例如若序列元素 n 一共出现了 m 次,则使 CountArr [n] = m;统计完毕后。根据统计的结果,将序列按顺序插入到原数组中即完成排序。计数排序时间复杂度为O(N+range),空间复杂度为 O(range)。计数排序看着貌似比快排还要厉害,但是它的局限性较高。计数排序适合范围 计数排序是一种非比较排序。它的主要思想是建立一个临时数组 CountArr ,用来统计序列中每个元素出现的次数,例如若序列元素 n 一共出现了 m 次,则使 CountArr [n] = m;统计完毕后。根据统计的结果,将序列按顺序插入到原数组中即完成排序。计数排序时间复杂度为O(N+range),空间复杂度为 O(range)。计数排序看着貌似比快排还要厉害,但是它的局限性较高。计数排序适合范围
- C++中的内存管理机制和C语言是一样的,但在具体内存管理函数上,C语言的malloc已经无法满足C++面向对象销毁的需求,于是祖师爷在C++中新增了一系列内存管理函数,即 new 和 delete 著名段子:如果你还没没有对象,那就尝试 new 一个吧 C++中的内存管理机制和C语言是一样的,但在具体内存管理函数上,C语言的malloc已经无法满足C++面向对象销毁的需求,于是祖师爷在C++中新增了一系列内存管理函数,即 new 和 delete 著名段子:如果你还没没有对象,那就尝试 new 一个吧
- 0x00 前言本文利用IDA分析4个简单的恶意程序,旨在基本掌握这4个恶意程序的C语言逻辑结构,同时这4个程序功能逐渐递增,循序渐进。笔者也是初学者,有些不足之处在所难免,请师傅们斧正0x01详细分析首先静态分析该exe文件,看下导入函数,其中一个调用了 WININET.dll中的 InternetGetConnectedState 函数,这个跟其他调用 kernel32.dll 中的函数相... 0x00 前言本文利用IDA分析4个简单的恶意程序,旨在基本掌握这4个恶意程序的C语言逻辑结构,同时这4个程序功能逐渐递增,循序渐进。笔者也是初学者,有些不足之处在所难免,请师傅们斧正0x01详细分析首先静态分析该exe文件,看下导入函数,其中一个调用了 WININET.dll中的 InternetGetConnectedState 函数,这个跟其他调用 kernel32.dll 中的函数相...
上滑加载中
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签